第20课 - 初始化列表的使用
第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课 - 初始化列表的使用相关推荐
- C++ 构造函数的初始化列表
(1)如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数.这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...
- 必须使用初始化列表的情况
在学习c++时,一直对必须使用初始化列表的情况说不全,或者说不清楚.今天来总结学习一下. 先回忆一下,必须使用初始化列表的情况 1.类数据成员为const类型 2. 类数据成员为引用类型 3.类没有默 ...
- C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: 1 class TestClass1 2 { 3 public: 4 TestClass1() { 5 cou ...
- c/c++教程 - 2.4.2.6 初始化列表语法,初始化列表参数
目录 4.2.6 初始化列表 相关教程 4.2.6 初始化列表 作用:C++提供了初始化列表语法,用来初始化属性 语法: 构造函数(): 属性1(值1),属性2(值2)...{ } 示例: 传统初始化 ...
- 【C++】-- 初始化列表
目录 一.用初始化列表初始化对象 1.初始化列表用法 2.初始化列表特性 二.explicit关键字 1.内置类型的隐式转换 2.如何避免单参构造函数初始化发生隐式类型转换 创建一个类对象时,编译器通 ...
- C++构造函数之初始化列表
C++构造函数之初始化列表 构造函数可以说是对于C++每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表 一.初始化列表的写法 仍 ...
- 派生类参数初始化列表和基类构造函数顺序
今天被问到了一个问题,随便回了一句,父类还没有构建,怎么能初始化父类的成员. 派生类构造函数的参数初始化列表,为什么不能初始化基类的成员? 例如下面的是不可以的 class Rectangle : p ...
- C++ 类构造函数初始化列表介绍
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式. 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个 ...
最新文章
- psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...
- 对话吴恩达:AI火得还不够,997都满足不了我
- 自动驾驶进入第3阶段 ADAS黑科技守护开车人
- “爸爸,什么是机器学习呀?”
- c语言extern关键字详解
- stc单片机入门c语言,谈谈单片机入门
- 操作系统:166个Linux实用命令,太全了!
- 如何使用eclemma插件_如何集成和使用EclEmma插件来获得良好的Junit覆盖率
- DataGridView 控件中至少有一列没有单元格模板的解决
- VMware Workstation Pro详细安装教程
- thermal 代码分析
- FNN 网络介绍与源码浅析
- C语言union总结
- 【C++面试必备】一个专栏带你搞定剑指offer第二版
- 01区块链研究的最新进展理论、建模和工具
- 计算机教育属于什么教育学类,应用电子技术教育专业属于什么门类
- java实现第一个数字
- 2022世界VR产业大会圆满收官,酷雷曼惊艳亮相!
- Eclipse 报错:Error: Program sh not found in PATH
- .NET动态生成PDF文件(利用iTextSharp)
热门文章
- SortedMap接口
- Theano2.1.5-基础知识之打印出theano的图
- Ural(Timus) 1081. Binary Lexicographic Sequence
- 第七章:无模式对话框 和 Windows通用对话框类
- (转载)Android手机开发总结
- python中如何打开csv文件_在Python中从CSV文件读取数据
- Hello World探究
- 计算机组成原理——I/O设备(外部设备)、I/O接口
- python连接阿里云odps
- Python 技术篇-解决转化后的exe程序被360误杀问题实例演示,python生成的exe被360识别为勒索病毒原因及解决方法