C++之初始化列表

问题

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

#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());

}

编译结果:

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

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


类成员的初始化

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

注意事项

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

修改上述代码如下:

#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 成员

#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;
}

输出:

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

小结

  • 类中可以使用初始化列表对成员进行初始化
  • 初始化列表先于构造函数体执行
  • 类中可以定义const 成员变量
  • const 成员变量必须在初始化列表中指定初值
  • const 成员变量为只读变量

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ShaoYL

结构体

40213
来自专栏黑泽君的专栏

Java中方法重写的两个面试题

  方法重写:     在子类中,出现和父类中一模一样的方法声明的现象。(包含方法名、参数列表和返回值类型都一样)   方法重载:     同一...

2911
来自专栏编程

Python基础知识2:字典

字典一种key - value 的数据类型,就像上学用的字典通过拼音查找汉字一样;字典是Python语言中唯一的映射类型。字典对象是可变的,它是一个容器类型,能...

23210
来自专栏微信公众号:Java团长

浅谈Java中的equals和==

  为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些...

973
来自专栏Jed的技术阶梯

详解 final 修饰符

被 final 修饰的实例变量必须显示的指定初始值,而且只能在以下3个位置指定初始值:

1504
来自专栏mathor

1小时掌握c++面向对象编程

使用对象指针实参仅将对象的地址值传递给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时间开销

751
来自专栏机器学习算法与Python学习

python: sort, sorted, reverse

python语言中的列表排序方法有三个:reverse反转/倒序排序、sort正序排序、sorted可以获取排序后的列表。在更高级列表排序中,后两中方法还可以加...

3688
来自专栏小樱的经验随笔

【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hel...

2927
来自专栏技术碎碎念

python3 入门 (四) 类与继承

Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。...

39012
来自专栏微信公众号:Java团长

浅谈Java中的equals和==

  为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些...

891

扫码关注云+社区

领取腾讯云代金券