1、问题
类中是否可以定义const成员?
2、小实验
下面的类定义是否合法?
-如果合法,ci的值是什么,存储在哪里?
- class Test()
- {
- private:
- const int ci;
- public:
- int getCI
- {
- return ci;
- }
- }
3、编程实验
类中的const成员 20-1.cpp
- #include <stdio.h>
- class Test
- {
- private:
- const int ci;
- public:
- Test()
- {
- ci = 10;
- }
- int getCI()
- {
- return ci;
- }
- };
- int main()
- {
- Test t;
- printf("t.ci = %d\n", t.getCI());
- return 0;
- }
·
4、类成员的初始化
C++中提供了初始化列表对成员变量进行初始化
语法规则
- ClassName::ClassName (): ml(vl), m2(vl,v2), m3(v3)
- {
- //some other initialize operation
- }
注意事项
- 成员的初始化顺序与成员的声明顺序相同
- 成员的初始化顺序与初始化列表中的位置无关
-初始化列表先于构造函数的函数体执行
5、编程实验
初始化列表的使用 20-2.cpp
- #include <stdio.h>
- class Value
- {
- private:
- int mi;
- public:
- Value(int i)
- {
- printf("i = %d\n", i);
- mi = i;
- }
- int getI()
- {
- return mi;
- }
- };
- class Test
- {
- private:
- Value m2;
- Value m3;
- Value m1;
- public:
- Test() : m1(1), m2(2), m3(3)
- {
- printf("Test::Test()\n");
- }
- };
- int main()
- {
- Test t;
- return 0;
- }
6、类中的const成员
类中的const成员会被分配空间的
类中的const成员的本质是只读变量
类中的const成员只能在初始化列表中指定初始值编译器无法直接得到const成员的初始值,因此
无法进入符号表成为真正意义上的常量。
7、编程实验
只读成员变量 20-3.cpp
- #include <stdio.h>
- class Value
- {
- private:
- int mi;
- public:
- Value(int i)
- {
- printf("i = %d\n", i);
- mi = i;
- }
- int getI()
- {
- return mi;
- }
- };
- class Test
- {
- private:
- const int ci;
- Value m2;
- Value m3;
- 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;
- }
8、小插曲
初始化与赋值不同
-初始化:对正在创建的对象进行初值设置
-赋值:对已经存在的对象进行值设置
9、小结
类中可以使用初始化列表对成员进行初始化
初始化列表先于构造函数体执行
类中可以定义const成员变量
const成员变量必须在初始化列表中指定初值
const成员变量为只读变量