Diretório do artigo
Um, oop orientado a objetos
Em c, temos várias definições de funções. Mas em C ++, somos o tipo abstrato de entidade. A figura a seguir descreve o relacionamento entre suas idéias oop.
Quatro características da linguagem OOP: polimorfismo de herança de encapsulamento abstrato (oculto)
Segundo, classes e objetos
Vamos descrever uma classe de mercadoria para especificar uma classe e um objeto.Primeiro
: defina uma classe de mercadoria, que é equivalente a uma estrutura na linguagem c.
1. Definição de classe
const int NAME_LEN = 20;
class CGoods
{
public:
void init(const char* name, double price, int amount);//做商品数据初始化
void show();//打印商品信息
void setName(char* name) { strcpy(_name, name); }
void setPrice(double price) { _price = price ;}
void setAmount(int amount) { _amount = amount ;}
const char* getName() {return _name;}
double getPrice() { return _price ;}
int getAmount() { return _amount; }
private:
char _name[NAME_LEN];
double _price;
int _amount;
};
Na classe acima, podemos entender
(1) private : atributos (variáveis de membro) são geralmente privadas
(2) public : O método membro fornece um método comum para o exterior para acessar propriedades privadas **. Os métodos implementados na classe são processados automaticamente em funções embutidas **
(3) setXXX e getXXX : defina uma interface para acessar variáveis de membros individualmente ou obter o valor de variáveis de membros e forneça um conjunto de métodos getXXX ou setXXX para variáveis de membros
(4) classe : tipo de dado abstrato de mercadoria, sem espaço ocupado CGoods pode definir inúmeros objetos, cada objeto tem sua própria variável de membro, mas eles compartilham um conjunto de métodos de membro.O tamanho da memória do objeto e da variável de membro
pode ser passado. Use apenas o comando cmd no VS para exibir o tamanho da memória do objeto.
2. Definição fora da classe
Os métodos definidos fora da classe devem ter um escopo definido antes do nome da função, que é uma função comum.Se você deseja se tornar uma função embutida, deve adicionar explicitamente
void CGoods::init(const char* name, double price, int amount)
{
strcpy(_name, name);
_price = price;
_amount = amount;
}
void CGoods::show()
{
cout << "name:" << _name << endl;
cout << "price:" << _price << endl;
cout << "amount:" << _amount << endl;
}
3. Classe de instanciação da função principal
int main()
{
CGoods good1;//类实例化了一个对象,对象占用空间,在栈上
good1.init("面包", 10.0, 200);
good1.show();
good1.setPrice(20.5);
good1.setAmount(100);
good1.show();
CGoods good2;
good2.init("空调", 10000.0, 50);
good2.show();
return 0;
}
O resultado da execução é:
Três, esse ponteiro
Função: Distinguir diferentes objetos no
método.Vamos pensar em um problema desse tipo:
(1) Como o init (nome, preço, quantidade) sabe em qual objeto inicializar as informações?
good1.init ("bread", 10.0, 200); na verdade, good1.init (& good1, "bread", 10.0, 200); o método de objeto da classe na qual o endereço do objeto é passado
é compilado, todos os parâmetros de método, Adicionará um ponteiro this para receber o endereço do objeto que chama o método
(2) Por que um conjunto de métodos pode lidar com vários objetos?
Porque quando um objeto chama um método, ele passa o endereço do objeto para sua função através de parâmetros reais, e essas funções usarão o ponteiro tils gerado no tempo de compilação para aceitar o endereço do objeto recebido.
A seguir está o método de chamada desse ponteiro
void CGoods::init(const char* name, double price, int amount)
{
strcpy(_name, name);
this->_price = price;
this->_amount = amount;
}
void CGoods::show()
{
cout << "name:" << this->_name << endl;
cout << "price:" << this->_price << endl;
cout << "amount:" << this->_amount << endl;
}