c++的初始化列表
来源:互联网 发布:ubuntu jdk 安装 编辑:程序博客网 时间:2024/06/06 18:06
1. 类中的const成员
声明如下类类型:
class TestCls{public: const int var; int get_var() { return var; }};
类中的const属性的成员var没有初始化,猜测是个随机值,尝试在main函数中实例化给类:
int main(void){ TestCls t; cout << "t.var = " << t.get_var() << endl; return 0;}
编译报错:
可见对var必须要初始化,怎么搞?可以这样?
class TestCls{public: const int var = 5; int get_var() { return var; }};
编译报错:
这是语法错误,因为这是类的声明。声明旨在告诉编译器,这个变量名是有定义的,但是不一定在这里定义,编译器能找到真正的定义之处;而定义是给一个变量真正分配空间,在编译过程中,每个变量有且仅有一次定义。对于类声明来说,空间都没有,你怎么可以为它初始化值?类只是一个抽象数据类型,并非实体的东西。利用这个抽象类型实例化成不同的对象后,对这个对象赋值才有意义。
既然以上语法行不通,那用构造函数试一下?
class TestCls{public: const int var; int get_var() { return var; } TestCls() { var = 0; }};
编译还是报错:
为什么?这就首先得搞懂初始化和赋值的差别。
初始化指在变量(或者常量)被定义的同时,在被分配的空间里直接放入值。
赋值是变量的空间分配完毕后,再修改该空间内容的操作。
常量只能被初始化,进入构造时,类中所有成员变量都已经被初始化了,也就是所有成员的空间都已经分配完毕,在构造函数里对var的操作是属于赋值了。
那要怎么办?往下看。
2. 初始化列表
要对类中的const成员变量进行初始化,需要使用初始化列表了。
class TestCls{public: const int var; int get_var() { return var; } TestCls() : var(6) //c++初始化列表 {}};
如上即为初始化列表的使用,编译运行都通过。
构造函数和初始化列表的差异在于,在构造函数里面,所有的变量常量的空间都分配完毕,常量本身不能被改变值,这时对其使用“=”是赋值操作,所以错误。初始化列表则是在分配空间的同时,为其空间初始化。
在这里需要强调的一点,类中的const成员会被分配空间的,它本质上只是只读属性的变量而非真正意义上的常量,const常量可以参照http://blog.csdn.net/qq_29344757/article/details/73173295文章的const关键字部分,而const只读变量虽然不可出现在赋值符号的左边,但是可以通过指针去修改其值的。类中的const成员只能在初始化列表中指定其值。
c++中初始化列表的语法规则为:
ClsName::ClsName() : m1(v1), m2(v2), m3(v3, v4){ //...}
使用示例1:构造函数传参给初始化列表
class TestCls1{private: int a; int b; int c;public: TestCls1(int x, int y, int z) : a(x), b(y), c(z) { //... } void Print(void) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; }};int main(void){ TestCls1 t(6, 7, 9); t.Print(); return 0;}
编译运行:
使用示例2:类中定义需要其他类的对象,且该对象需要初始化列表
class TestCls1{private: int a; int b; int c;public: TestCls1(int x, int y, int z) : a(x), b(y), c(z) { //... } TestCls1() : a(0), b(10), c(100) { //... } void Print(void) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; }};class TestCls2{public: int x; int y; TestCls1 m_t; TestCls2() : m_t(4, 8, 6) //通过TestCls1类的构造函数传参给TestCls1类的初始化列表 { //... }};
3. 一些重要结论
(1) 在初始化列表中,成员的初始化顺序和成员的声明顺序相同,与初始化列表的位置顺序无关。
(2) 初始化列表先于构造函数执行。
(3) 类中可以定义const成员变量,它并非真正意义的常量,而是只读变量,其初始化方式只能依靠初始化列表。
- c++-类的初始化列表
- 【C/C++】构造函数的初始化列表
- C/C++--初始化列表
- C++:只用初始化列表初始化变量的几种情况
- [C++] 列表初始化
- C++—初始化列表
- 初始化列表的初始化顺序
- c++の对象初始化列表
- C++——初始化列表
- C/C++ - 数组初始化列表为空的区别
- 类的初始化列表
- 类的初始化列表
- 初始化列表的作用
- 初始化列表的使用
- 初始化列表的问题
- 初始化列表的使用
- C++的初始化列表
- c++的初始化列表
- 剑指offer——数值的整数次方
- Face Faster RCNN安装步骤和遇到的问题
- Java初学者的学习路线建议
- vagrant中Vagrantfile配置
- python36 c++调用python
- c++的初始化列表
- C#基础
- UVA1640 数位统计
- JQuery_九大选择器
- 01. JQuery 选择器与事件
- excel 128code ttf 编码转换
- OCR-光学字符识别之训练Tesseract3字库图文详解
- 宁波市第31届中小学程序设计比赛模拟试题 chicken
- JDK安装过程