前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++之初始化列表

C++之初始化列表

作者头像
程序手艺人
发布2018-05-18 15:32:18
7790
发布2018-05-18 15:32:18
举报
文章被收录于专栏:程序手艺人程序手艺人

问题

类中是否可以定义 const 成员?

代码语言:javascript
复制
#include<stdio.h>

class Test
{
private:
    const int ci = 0;
public:
    int getCI() { return ci; }
};

int main()
{
    Test t;
    printf("t.ci = %d\n",t.getCI());

}

编译结果:

代码语言:javascript
复制
t20.cpp:13:10: error: uninitialized const member in ‘class Test’
     Test t;
  • 代表类中可以定义const成员变量, 但是面临的问题是: 如何初始化类中const 成员变量

这时候引入本文的重点, 初始化列表出场:


类成员的初始化

  • C++ 中提供了初始化列表对成员变量进行初始化
  • 语法规则
代码语言:javascript
复制
ClassName::ClassName() :
          m1(v1), m2(v1,v2),m3(v3)
{
   //some other initialize operation 
}

注意事项

  • 成员的初始化顺序与成员的声明顺序相同
  • 成员的初始化顺序与初始化列表中位置无关
  • 初始化列表先于构造函数的函数体执行

修改上述代码如下:

代码语言:javascript
复制
#include<stdio.h>

class Test
{
private:
    const int ci;
public:
    Test():ci(10)
    {
        //ci = 10; 
    }
    int getCI() { return ci; }
};

int main()
{
    Test t;
    printf("t.ci = %d\n",t.getCI());

}
  • 正常编译输出: t.ci = 10

类中的const 成员

代码语言:javascript
复制
#include<stdio.h>

class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n",i) ;
        mi = i;
    }
    int get()
    {
        return mi; 
    }
};


class Test
{
private:
    const int ci;
    Value m3;
    Value m2;
    Value m1;
public:
    Test():m1(1),m2(2),m3(3),ci(100)
    {
        printf("Test::Test()\n");
    }
    int getCi()
    {
        return ci;
    }
    int setCi(int v)
    {
        int *p = const_cast<int *>(&ci);

        *p = v;
    }
};

int main()
{
    Test t;
    printf("t.ci = %d\n",t.getCi());
    t.setCi(10);
    printf("t.ci = %d\n",t.getCi());
    return 0;
}

输出:

代码语言:javascript
复制
i = 3
i = 2
i = 1
Test::Test()
t.ci = 100
t.ci = 10
  • 类中的const 成员会被分配空间的
  • 类中的const 成员的本质是只读变量
  • 类中的const 成员只能在初始化列表中指定初始值

小结

  • 类中可以使用初始化列表对成员进行初始化
  • 初始化列表先于构造函数体执行
  • 类中可以定义const 成员变量
  • const 成员变量必须在初始化列表中指定初值
  • const 成员变量为只读变量
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年03月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 类成员的初始化
    • 注意事项
    • 类中的const 成员
    • 小结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档