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),所以并不是按顺序依次赋值,而是先自动找好类型,然后按照类型顺序依次赋值的。

声明:本文部分内容摘自百度百科

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 函数指针

    前言: 先看两个基础,函数指针和extern关键字,然后由一个具体的例子,具体使用下函数指针。 一、基础 函数指针:即指向函数的指针,本质还是一个指针。 函数指...

    用户1215536
  • 多维数组的理解

    要清楚的理解多维数组,需要先理解指针的算术运算和数组名的含义。 1、指针的算术运算     指针的算术运算与普通的类型的算术运算是不同的,编译器会在指针的算术运...

    用户1215536
  • 经典算法学习之贪心算法

    贪心算法也是用来求解最优化问题的,相比较动态规划很多问题使用贪心算法更为简单和高效,但是并不是所有的最优化问题都可以使用贪心算法来解决。 贪心算法就是在每个决策...

    用户1215536
  • 栈的基本操作就是出栈和入栈,这两个的时间复杂度都是O(1) 数据结构 typedef struct Stack{ int data[MAXSIZE]; ...

    用户1154259
  • C++中的stack类、QT中的QStack类

    C++中的stack 实现一种先进后出的数据结构,是一个模板类. 头文件 #include<stack> 用法(以int型为例): stack <int> s;...

    张诺谦
  • 关于栈的简单应用的小例子

    栈是一种只允许在一端进行插入和删除操作的线性表。在栈中,进行操作的一端叫做栈顶,相应地,另一端称为栈底。

    Reborn Lee
  • F-Stack Q&A 第二期

    Q1:请问再视频领域,媒体服务器,使用F-Stack是否合适? A1:F-Stack在纯推流的模式上是支持且合适的,如果有转码服务等计算密集型服务,需要等我们支...

    F-Stack
  • 【短讯】万事达使用区块链技术

    区块链大本营
  • 关于C/C++ 一些自己遇到的问题以及解惑

    有些自己遇到的,有一些是通过群友的提问应发的,问题本身的价值可能并不高,但其背后的原因才是我们应该学习的,下面我们来看看。

    花狗Fdog
  • Mysql基础篇--面试如何定位低效率sql语句

    当面对一个sql性能问题,我们应该从何处入手使得尽快定位问题sql,我们从基础的命令开始

    小土豆Yuki

扫码关注云+社区

领取腾讯云代金券