C++初始化列表
时间:2022-04-26
本文章向大家介绍C++初始化列表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、什么是初始化列表
与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段
二、构造函数执行分为初始化和构造两个阶段,且初始化化阶段优先于计算阶段
三、一个好的原则是,能使用初始化列表的时候尽量使用初始化列表
因为初始化列表有时能少调用一次默认构造函数
四、必须要用初始化列表的时候
1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化
五 、成员变量是按照在类中声明的顺序被初始化的而不是在初始化列表中的顺序
struct foo
{
int i ;int j ;
foo(int x):i(x), j(i){}; // ok, 先初始化i,后初始化j
};
再看下面的代码:
struct foo
{
int i ;int j ;
foo(int x):j(x), i(j){} // i值未定义
};
这里i的值是未定义的因为虽然j在初始化列表里面出现在i前面,但是i先于j定义,所以先初始化i,而i由j初始化,此时j尚未初始化,所以导致i的值未定义。一个好的习惯是,按照成员定义的顺序进行初始化。
六、含有参数的继承类的初始化
代码1如下:
1 // 集成类的初始化实验.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 using namespace std;
7
8 class A
9 {
10 public:
11 int a,b;
12 char c;
13 A(int a1,int b1,char c1)
14 {
15 a=a1;
16 b=b1;
17 c=c1;
18 }
19 virtual ~A(){}
20 };
21
22 class B:public A
23 {
24 public:
25 int d;
26 B(int a2,int b2,char c2,int d2):A(a2,b2,c2)
27 {
28 d=d2;
29 }
30 virtual~B(){}
31 };
32 int _tmain(int argc, _TCHAR* argv[])
33 {
34 B b=B(1,2,'a',3);
35 cout<<b.a<<endl<<b.b<<endl<<b.c<<endl<<b.d;
36 return 0;
37 }
从执行结果上看,好像是将34行中B b=B(1,2,3,'a');的1,2,3,'a'依次赋值给26行中B(int a2,int b2,char c2,int d2):A(a2,b2,c2)的a2,b2,c2,d2,然后在将a2,b2,c2,依次赋值给13行中A(int a1,int b1,char c1) 的a1,b1,c1 将代码改变一下:
1 // 集成类的初始化实验.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 using namespace std;
7
8 class A
9 {
10 public:
11 int a,b;
12 char c;
13 A(int a1,int b1,char c1)
14 {
15 a=a1;
16 b=b1;
17 c=c1;
18 }
19 virtual ~A(){}
20 };
21
22 class B:public A
23 {
24 public:
25 int d;
26 B(int a2,int b2,int d2,char c2):A(a2,b2,c2)
27 {
28 d=d2;
29 }
30 virtual~B(){}
31 };
32 int _tmain(int argc, _TCHAR* argv[])
33 {
34 B b=B(1,2,3,'a');
35 cout<<b.a<<endl<<b.b<<endl<<b.c<<endl<<b.d;
36 return 0;
37 }
从执行结果上看,并没有将d2的值3直接赋值给c2(c1),所以并不是按顺序依次赋值,而是先自动找好类型,然后按照类型顺序依次赋值的。
声明:本文部分内容摘自百度百科
- DateFormat 线程不安全
- zip文件操作导致JVM crash
- 如何搭建你自己的“深度学习”机器?
- MySQL INSERT INTO...ON DUPLICATE KEY UPDATE的使用
- 通过Java代码来模拟乘法器
- INET_ATON()函数在MySQL5.6版本和5.7版本的差异
- Linux主机之间ssh免密登录配置
- 远控木马Posion Ivy开始肆虐缅甸和其它亚洲国家
- Slf4j+Logback配置文件变量使用小记
- Storm消息处理可靠性保证
- git+github创建分支&提交并贡献代码(linux环境)
- 使用Nginx代理restful实现SSL链路加密
- 使用Nginx代理thrift NIO实现SSL链路加密
- TThreadedSelectorServer介绍及Direct Memory OOM分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 023.Ubuntu常见个性化配置
- 快速学习-ElasticJob的FAQ
- 设计模式~状态模式
- 程序员该造轮子吗,造轮子能升职加薪吗?
- 1.基本标签
- 细品mysql之Join 语句的执行过程
- A Java Fork/Join Framework(Doug Lea 关于java Fork/Join框架的论文翻译)
- Mysql 的安装
- Spring系列之数据源的配置 数据库 数据源 连接池的区别
- STM32F4 SPI DMA
- 快速学习-XXL-JOB总体设计
- Android中Input事件初始化、接收以及分发
- 快速学习-XXL-JOB操作指南
- 快速学习-XXL-JOB任务详解
- PyQt5 技术篇-scrollArea不显示滚动条解决方法。Qt Designer不显示滚动条。滚动条的显示和隐藏。