子类的构造函数可以使用初始化列表的方式对父类的成员变量进行赋值吗?

class Rectangle{
public:
    Rectangle() :a(0), b(0){}
    Rectangle(int x, int y) :a(x), b(y){}
 
public:
    int a;
    int b;
};
class Square :public Rectangle
{
public:
    Square(int x):a(x) {}
};
首先注意一点就是:父类的成员变量必须设置为public,否则子类这边拿不到

现在分析一下子类创建一个对象的过程,首先在堆或者在栈中开辟出一块空间,空间的大小由子类本身的成员变量大小和父类的成员变量大小,如果有虚函数,第一个位置还要加上虚函数的指针。

然后所有变量对应的位置处全是垃圾值

注意有一点要求:标准要求,每个对象在其生命周期内只能被初始化一次. 这是一个非常显然的要求

主要原因还是在于:初始化列表是在定义这个变量的同时就对其进行初始化赋值。在子类调用它的构造函数之前,先调用父类的构造函数对成员变量进行初始化赋值。此时a变量已经初始化完了。此时调用子类的构造函数,发现需要再次对a变量进行初始化,但是a已经被初始化过了。

而如果是构造函数赋值的方式,调用子类的构造函数的时候,先对其赋予垃圾值,然后将x的值赋给变量a,此时不算是初始化了,算是再次赋值,是可以进行的。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值