类A的对象作为类B的成员时,类A的构造函数如何调用

  • 最简单情况,类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的构造函数的“:”后面调用,如果定义在函数体内就和类成员定义顺序矛盾,从而编译失败

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值