首页 > 编程语言 > 详细

C++ 成员初始化列表

时间:2020-06-15 23:01:51      阅读:53      评论:0      收藏:0      [点我收藏+]

——调用构造函数时,对象将在括号中的代码执行前被创建,因此无法在括号内初始化对象的常量成员。

Queue::Queue(int qs)
{
    front = rear = NULL;
    items = 0;
    qsize =qs;    // not acceptable! qsize是一个常量成员
}

因此C++提供了一种特殊的语法来完成上述工作——成员初始化列表

它是什么样子:

  • 由逗号分隔的初始化列表组成(前面带冒号)。
  • 位于参数列表的右括号之后、函数体左括号之前。
  • 如果数据成员的名称为mdata,并需要将它初始化为val,则初始化器为mdata(val)。
    1 Queue::Queue(int qs) : qsize(qs), items(0) // initialize qsize to qs, 0 to items
    2 {
    3     front = rear = NULL;
    4 } 

     初值可以是常量或构造函数的参数列表中的参数,并且初始化并不只限定用于常量

何时使用:

  • 只有构造函数可以使用种初始化列表语法,不能将成员初始化列表用于构造函数之外的其它类方法
  • 对于本身就是类对象的成员来说,使用成员初始化列表的效率更高(直接调用复制构造函数,代替了调用默认复制构造函数再操作对象(使用赋值运算符赋值等)的步骤)
  • 非静态const成员必须使用这种语法(在C++11之前)
  • 被声明为引用的类成员必须使用这种语法

特点

  • 数据成员被初始化的顺序于它们出现在类声明中的顺序相同,与初始化器中的排列顺序无关
  • 成员初始化列表使用的括号方式也可用于常规初始化
    • 即可将
      int games = 162;
      double talk = 2.17828;

       替换为

      int games(162);
      double talk(2.17828);

C++11:

——C++11允许以更直观的方式进行初始化(非静态const成员,非静态成员):

class Classy
{
    int mem1 = 10;    // in-class initialization
    const int mem2 = 20;    // in-class initialization
    ...
};

  如果调用了使用成员初始化列表的构造函数,在这种情况下,实际列表将覆盖这些默认初始值

 
 

 

C++ 成员初始化列表

原文:https://www.cnblogs.com/suui90/p/13137818.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!