美文网首页
C++之初始化列表

C++之初始化列表

作者: 程序手艺人 | 来源:发表于2018-03-22 08:30 被阅读14次

问题

类中是否可以定义 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 成员变量为只读变量

相关文章

  • C++初始化列表

    引言 用c++的人都知道,c++的构造函数具有初始化列表,初始化列表有什么作用?什么情况下必须使用初始化列表...

  • [C++之旅] 11 初始化列表

    [C++之旅] 11 初始化列表 初始化列表的特性 初始化列表先于构造函数执行 初始化列表只能用于构造函数 初始化...

  • C++的初始化列表和列表初始化

    C++的初始化列表和列表初始化 初始化列表 初始化列表是声明在构造函数中来实现的,相当于初始化,而不是复制操作 初...

  • C++初始化列表

    本文主要说明成员初始化列表的注意事项。 I、上帝视角看初始化列表 构造函数可以有两种构造形式,一是在构造函数体内对...

  • c++ 初始化列表

    初始化列表可以改变private里const 的值

  • C++之初始化列表

    问题 类中是否可以定义 const 成员? 编译结果: 代表类中可以定义const成员变量, 但是面临的问题是: ...

  • C++初始化列表 多态

    初始化列表 特点 一种便捷的初始化成员变量的方式 只能在构造函数中 初始化列表与默认参数配合使用 如果函数的声明和...

  • 成员初始化列表

    C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数...

  • 001 列表初始化

    列表初始化 C++ 语言定义了初始化的好几种不同形式,这也是初始化问题复杂性的一个体现。例如,要想定义一个名为 u...

  • C++中的初始化列表

    类成员的初始化 首先来看一段代码: 请问上述代码可以执行么?答案是不可以,因为在Test类初始化时必须明确的初始化...

网友评论

      本文标题:C++之初始化列表

      本文链接:https://www.haomeiwen.com/subject/yemzzxtx.html