第20课 - 初始化列表的使用

0. 问题

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

  下面的类定义是否合法?如果合法ci 的值是什么存储在哪里

1 class Test
2 {
3 private:
4     const int ci;
5 public:
6     int getCI() { return ci;}
7 };

 1 #include <stdio.h>
 2
 3 class Test
 4 {
 5 private:
 6     const int ci;
 7 public:
 8     Test()
 9     {
10         ci = 10;
11     }
12     int getCI()
13     {
14         return ci;
15     }
16 };
17
18
19 int main()
20 {
21     Test t;
22
23     printf("t.ci = %d\n", t.getCI());
24
25     return 0;
26 }

类中的const成员

在C中:const 修饰的变量必须在定义的时候进行初始化,不能在定义之后对其进行赋值操作,违背了const 的含义。

在C++中:构造函数内部是对成员变量进行赋值操作,而不是初始化。初始化需要初始化列表。

1. 类成员的初始化

  (1)C++ 中提供了初始化列表,可以对成员变量进行初始化

  (2)语法规则:

ClassName::ClassName():m1(v1), m2(v2,v3),m3(v3)
{//其它初始化操作
}

 1 // 构造函数是对变量进行赋值操作,初始化列表是进行初始化操作,两个是不同的概念
 2
 3 #include <stdio.h>
 4
 5 class Test
 6 {
 7 private:
 8     int i;
 9     int j;
10     const int k;
11 public:
12     int getI()
13     {
14         return i;
15     }
16     int getJ()
17     {
18         return j;
19     }
20     int getK()
21     {
22         return k;
23     }
24
25     Test() : k(10)
26     {
27         printf("invoke consttuctor!\n");
28         i = 1;
29         j = 2;
30     }
31 };
32
33 int main(void)
34 {
35     Test t1;
36
37     printf("t1.getI() = %d, t1.getJ() = %d, t1.getK() = %d\n", t1.getI(), t1.getJ(), t1.getK());
38
39     return 0;
40 }

const变量的初始化(解决构造函数中不能初始化)

  (3)注意事项

    ① 成员的初始化顺序与成员的声明顺序相同,而与初始化列表中的位置无关

    ② 初始化列表先于构造函数的函数体执行

 1 #include <stdio.h>
 2
 3 class value
 4 {
 5 private:
 6     int m_i;
 7 public:
 8     value(int val) : m_i(100)
 9     {
10         printf("in value!\n");
11         printf("m_i = %d\n", m_i);
12         m_i = val;
13     }
14
15     int getM_i()
16     {
17         return m_i;
18     }
19 };
20
21 class Test
22 {
23 private:
24     value m1;
25     value m2;
26 public:
27     Test() : m1(1), m2(2)    // 初始化列表,对m1, m2进行初始化。初始化还是调用value类中的构造函数,但还是先执行value中的初始化列表
28     {
29         printf("in Test!\n");
30     }
31
32     int get()
33     {
34         return m1.getM_i();
35     }
36 };
37
38 int main(void)
39 {
40     Test t1;
41
42     printf("t1.get() = %d\n", t1.get());
43
44     return 0;
45 }

初始化列表的使用

2. 类中的 const 成员

  (1)类中的 const 成员会被分配空间,局部对象会分配栈空间、动态对象会分配堆空间、全局对象会分配静态存储空间(和const int i; 不同)

  (2)类中的 const 成员的本质是只读变量,可以通过指针隐式的修改。编译器无法直接得到 const 成员的初始值,因此无法进入符号表成为真正意义上的常量

  (3)类中的 const 成员只能在初始化列表中指定初始值

 1 #include <stdio.h>
 2
 3 class Value
 4 {
 5 private:
 6     int mi;
 7 public:
 8     Value(int i)
 9     {
10         printf("i = %d\n", i);
11         mi = i;
12     }
13
14     int getI()
15     {
16         return mi;
17     }
18 };
19
20 class Test
21 {
22 private:
23     const int ci;
24     Value m2;
25     Value m3;
26     Value m1;
27 public:
28     Test() : m1(1), m2(2), m3(3), ci(100)  // 成员变量的初始化
29     {
30         printf("Test::Test()\n");
31     }
32
33     int getCI()
34     {
35         return ci;
36     }
37
38     int setCI(int v)
39     {
40         // 说明ci是个只读变量,可以通过指针修改内存值
41         int* p = const_cast<int*>(&ci);
42         *p = v;
43     }
44 };
45
46 int main()
47 {
48     Test t;
49
50     printf("t.ci = %d\n", t.getCI());
51
52     t.setCI(10);
53
54     printf("t.ci = %d\n", t.getCI());
55
56     return 0;
57 }

const只读成员变量

小插曲初始化赋值不同

  (1)初始化:对正在创建的对象进行初值设置
  (2)赋值:   对已经存在的对象进行值设置

3. 小结

  (1)类中可以使用初始化列表对成员进行初始化

  (2)初始化列表先于构造函数体执行

  (3)类中可以定义 const 成员变量

  (4)const 成员变量必须在初始化列表中指定初始值

  (5)const 成员变量为只读变量

转载于:https://www.cnblogs.com/shiwenjie/p/7235100.html

第20课 - 初始化列表的使用相关推荐

  1. C++ 构造函数的初始化列表

    (1)如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数.这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化 ...

  2. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  3. 必须使用初始化列表的情况

    在学习c++时,一直对必须使用初始化列表的情况说不全,或者说不清楚.今天来总结学习一下. 先回忆一下,必须使用初始化列表的情况 1.类数据成员为const类型 2. 类数据成员为引用类型 3.类没有默 ...

  4. C++中类成员变量在初始化列表中的初始化顺序

    引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: 1 class TestClass1 2 { 3 public: 4 TestClass1() { 5 cou ...

  5. c/c++教程 - 2.4.2.6 初始化列表语法,初始化列表参数

    目录 4.2.6 初始化列表 相关教程 4.2.6 初始化列表 作用:C++提供了初始化列表语法,用来初始化属性 语法: 构造函数(): 属性1(值1),属性2(值2)...{ } 示例: 传统初始化 ...

  6. 【C++】-- 初始化列表

    目录 一.用初始化列表初始化对象 1.初始化列表用法 2.初始化列表特性 二.explicit关键字 1.内置类型的隐式转换 2.如何避免单参构造函数初始化发生隐式类型转换 创建一个类对象时,编译器通 ...

  7. C++构造函数之初始化列表

    C++构造函数之初始化列表 构造函数可以说是对于C++每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表 一.初始化列表的写法 仍 ...

  8. 派生类参数初始化列表和基类构造函数顺序

    今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员. 派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的 class Rectangle : p ...

  9. C++ 类构造函数初始化列表介绍

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式. 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个 ...

最新文章

  1. psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...
  2. 对话吴恩达:AI火得还不够,997都满足不了我
  3. 自动驾驶进入第3阶段 ADAS黑科技守护开车人
  4. “爸爸,什么是机器学习呀?”
  5. c语言extern关键字详解
  6. stc单片机入门c语言,谈谈单片机入门
  7. 操作系统:166个Linux实用命令,太全了!
  8. 如何使用eclemma插件_如何集成和使用EclEmma插件来获得良好的Junit覆盖率
  9. DataGridView 控件中至少有一列没有单元格模板的解决
  10. VMware Workstation Pro详细安装教程
  11. thermal 代码分析
  12. FNN 网络介绍与源码浅析
  13. C语言union总结
  14. 【C++面试必备】一个专栏带你搞定剑指offer第二版
  15. 01区块链研究的最新进展理论、建模和工具
  16. 计算机教育属于什么教育学类,应用电子技术教育专业属于什么门类
  17. java实现第一个数字
  18. 2022世界VR产业大会圆满收官,酷雷曼惊艳亮相!
  19. Eclipse 报错:Error: Program sh not found in PATH
  20. .NET动态生成PDF文件(利用iTextSharp)

热门文章

  1. SortedMap接口
  2. Theano2.1.5-基础知识之打印出theano的图
  3. Ural(Timus) 1081. Binary Lexicographic Sequence
  4. 第七章:无模式对话框 和 Windows通用对话框类
  5. (转载)Android手机开发总结
  6. python中如何打开csv文件_在Python中从CSV文件读取数据
  7. Hello World探究
  8. 计算机组成原理——I/O设备(外部设备)、I/O接口
  9. python连接阿里云odps
  10. Python 技术篇-解决转化后的exe程序被360误杀问题实例演示,python生成的exe被360识别为勒索病毒原因及解决方法