侧边栏壁纸
博主头像
如此肤浅博主等级

但行好事,莫问前程!

  • 累计撰写 24 篇文章
  • 累计创建 12 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录
C++

C++ | 成员初始化列表

如此肤浅
2022-04-22 / 0 评论 / 1 点赞 / 406 阅读 / 587 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-10-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

如果Classy是一个类,而mem1、mem2和mem3都是这个类的数据成员,则类构造函数可以使用如下的语法来初始化数据成员:

Classy::Classy(int n, int m) : mem1(n), mem2(0), mem3(n*m + 2)
{
  ...
}

上述代码将mem1初始化为n,将mem2初始化为0,将mem3初始化为n*m+2。从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。

  • 案例
    类A的成员如下:

    Class A
    {
    private:
      int item;
      const int asize;
      ...
    public:
      ...
    }
    

    未使用成员初始化列表的构造函数如下:

    A::A(int s)
    {
      item = 0;
      asize = s;	// 不被允许
    }
    

    asize是常量,因此可以对它初始化,但不能赋值。从概念上说,调用构造函数时,对象将在括号中的代码执行之前被创建。因此,调用A(int s)构造函数将导致程序首先给2个成员变量分配内存。然后,程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。因此,对于const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始化。

    因此,需要采用成员初始化列表的构造函数:

    A::A(int s) : item(0), asize(s)
    {}
    
  • 注意
    ① 这种格式只能用于构造函数;
    ② 必须用这种格式来初始化非静态const 数据成员
    ③ 必须用这种格式来初始化引用数据成员

1

评论区