有哪几种情况只能用intialization list 而不能用assignment

无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果都是相同的。不同之处在于,使用构造函数初始化列表初始化数据成员,没有定义初始化列表的构造函数在构造函数体中对数据成员赋值。
对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表。
还有一种情况就是, 类的构造函数需要调用其基类的构造函数的时候。请看下面的代码:
#include <iostream>
 using namespace std;

 class A                      //A是父类
 {
       private:
                int a;                   //private成员
       public:
               A() {}
              A(int x):a(x) {}           //带参数的构造函数对a初始化
              void printA()             //打印a的值
              {
                       cout << "a = " << a << endl;
              }
 };
 class B : public A //B是子类
 {
     private:
              int b;
     public:
              B(int x, int y) : A(x)      //需要初始化b以及父类的a
              {
                       //a = x;           //a为private,无法在子类被访问,编译错误
                       //A(x);            //调用方式错误,编译错误
                       b = y;
              }
              void printB() //打印b的值
              {
                       cout << "b = " << b << endl;
              }
 };
   
 int main()
 {
              B b(2,3);
            
              b.printA();             //调用子类的printA()
              b.printB();             //调用自己的printB()
   
              return 0;
 }

从上面的程序可以看到,如果在子类的构造函数中需要初始化父类的private成员,直接对其赋值是不行的(代码23行),只有调用父类的构造函数才能完成对它的初始化。但在函数体内调用父类的构造函数也是不合法的(代码24行),只有采取21行中的初始化列表调用子类构造函数的方式。程序的执行结果如下:

a = 2
b = 3
当类中含有const、reference成员变量以及基类的构造函数都需要初始化列表。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值