- 最简单情况,类A和类B都没有成员变量
class A{
public:
A(){cout << "this is A" << endl;}
};
class B{
A a;
public:
B(){ cout << "this is B" << endl;}
};
int main(int argc, const char **argv)
{
B b;
cout << sizeof(A) << "\t" << sizeof(B) << endl;
return 0;
}
执行结果
可以看出类A先于类B构造,这是符合构造类对象时的执行顺序的。
由于类A和类B都是空类,虽然类B包含了类A的对象,然而他们所占用的内存大小依旧都是1
- 类A具有成员变量,但是类B没有成员变量
class A{
int a;
public:
A(){cout << "this is A" << endl;}
};
class B{
A a;
public:
B(){ cout << "this is B" << endl;}
};
int main(int argc, const char **argv)
{
B b;
cout << sizeof(A) << "\t" << sizeof(B) << endl;
return 0;
}
和上面执行结果相同,只是sizeof(A) = sizeof(B)=4
- 类A只有一个带参数的构造
class A{
int a;
public:
A() = delete ;
A(int va) : a(va) { cout << "this is A a = " << a << endl; }
};
class B{
A a;
public:
B(int b) : a(b) {
cout << "this is B" << endl;
}
};
int main(int argc, const char **argv)
{
B b(10);
cout << sizeof(A) << "\t" << sizeof(B) << endl;
return 0;
}
此时A的对象的构造函数必须在类B的构造函数的“:”后面,而不能在类B的构造函数的函数体内。这和类成员的构造顺序相关。一个类在构造时,先定义成员变量,而后在调用成员函数,所以类A的构造必须在类B的构造函数的“:”后面调用,如果定义在函数体内就和类成员定义顺序矛盾,从而编译失败