La operación de construcción del constructor predeterminado
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;