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 inclass 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 成员变量为只读变量

猜你喜欢

转载自blog.csdn.net/z2066411585/article/details/79648601