La operación de construcción del constructor predeterminado de C ++

1 objeto miembro con constructor predeterminado

1.1 Comportamiento

Cuando el objeto externo contiene un objeto miembro, el compilador agregará automáticamente la llamada cuando el constructor del objeto miembro no sea llamado explícitamente;

1.2 Código de muestra

#include <iostream>
#include <string>
using namespace std;
class A
{
    
    
public:	
	A() {
    
     cout << "call A()" << endl; }
	A(int value) {
    
     cout << "call A(value)" << endl; }
};
class B
{
    
    
private:
	A a;
	int value;
	string name;
public:
	B() {
    
    
		name = "aloha";
	}
	void show() 
	{
    
    
		cout << "B value=" << value << ",name=" << name <<endl; 
	};
};

int main()
{
    
     
	B b;
	b.show();
}

1.3 Salida

call A()
B value=-858993460,name=aloha

Nota:
Si el constructor predeterminado de A en el código de comentario, la compilación no pasará.

El constructor no predeterminado de A debe llamarse explícitamente en el constructor de B a través de la lista de inicialización

	B():a(0) {
    
     
		name = "aloha";
	}

2 El tipo padre tiene un constructor predeterminado

2.1 Comportamiento

En el constructor del subtipo, se llama automáticamente al constructor del tipo padre.

2.2 Código de muestra 1

#include <iostream>
#include <string>
using namespace std;
class A
{
    
    
public:	
	A() {
    
     cout << "call A()" << endl; }
	A(int value) {
    
     cout << "call A(value)" << endl; }
}; 

class AA:public A
{
    
     
	int value;
	string name;
public:
	AA()  {
    
     
		value = 0;
		name = "aloha";
	}
	void show()
	{
    
    
		cout << "AA value=" << value << ",name=" << name << endl;
	};

};

int main()
{
    
     
	AA aa;
	aa.show();
}

2.3 Salida 1

call A()
AA value=0,name=aloha

2.4 Código de muestra 2

#include <iostream>
#include <string>
using namespace std;
class A
{
    
    
public:	
	A() {
    
     cout << "call A()" << endl; }
	A(int value) {
    
     cout << "call A(value)" << endl; }
}; 

class AA:public A
{
    
     
	int value;
	string name;
public:
	AA()  
	{
    
     
		value = 0;
		name = "aloha";
	}
	AA(int value)
	{
    
    
		this->value = value;
		name = "aloha";
	}
	void show()
	{
    
    
		cout << "AA value=" << value << ",name=" << name << endl;
	};

};

int main()
{
    
     
	AA aa(5);
	aa.show();
}

2.5 Salida 2

call A()
AA value=5,name=aloha

3 El caso de ambos

3.1 Comportamiento

Primero llame al método de construcción predeterminado de la clase principal y luego llame al método de construcción predeterminado del objeto miembro

3.2 Código de muestra

#include <iostream>
#include <string>
using namespace std;
class A
{
    
    
public:	
	A() {
    
     cout << "call A()" << endl; }
	A(int value) {
    
     cout << "call A(value)" << endl; }
}; 
class B
{
    
    
public:
	B() {
    
     cout << "call B()" << endl; }
	B(int value) {
    
     cout << "call B(value)" << endl; }

};
class AAB:public A
{
    
     
	int value;
	string name;
	B b;
public:
	AAB()
	{
    
     
		value = 0;
		name = "aloha";
	}
	AAB(int value) 
	{
    
    
		cout << "AAB start" << endl;
		this->value = value;
		name = "aloha";
		cout << "AAB end" << endl;
	}
	void show()
	{
    
    
		cout << "AAB value=" << value << ",name=" << name << endl;
	};

};

int main()
{
    
     
	AAB aab(5);
	aab.show();
}

3.3 Salida

call A()
call B()
AAB start
AAB end
AAB value=5,name=aloha

4 referencias

"Exploración en profundidad del modelo de objetos C ++", de Stanley B. Lippman, traducido por Hou Jie, Electronic Industry Press, 2012;

Supongo que te gusta

Origin blog.csdn.net/skytering/article/details/105908949
Recomendado
Clasificación