C++:类的简单介绍(六)——初始化列表

C++:类的简单介绍(六)——初始化列表_第1张图片

目录

格式:

初始化之间的比较:

普通初始化的缺点:

初始化列表的优势: 

必须进行初始化的变量 

 1、const 修饰的变量

2、被&修饰的变量  引用 

3、自定义类型,且没有默认构造函数的成员变量必须走初始化列表 

小总结: 

函数体和初始化列表的灵活使用:

哪一些操作必须走函数体? 

1、检查: 

2、数组的连续赋值: 

注意事项:

坑点/面试题: 


 格式:

以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。

class Date
{
public:
Date(int year, int month, int day)
  : _year(year)
     , _month(month)
     , _day(day)
 {}
private:
int _year;
int _month;
int _day;
};

初始化之间的比较:

C++:类的简单介绍(六)——初始化列表_第2张图片

普通初始化的缺点:

普通初始化对连续定义一个变量时,或者说进行多次初始化可能会出现错误,就如上图所示的_year = year 之后又有了_year = 1,面对这种情况编译器容易出现问题,所以就出现了初始化列表专门解决这种问题!

C++:类的简单介绍(六)——初始化列表_第3张图片

初始化列表的优势: 

1、 在初始化列表中,规定了一个变量只能出现一次! 

C++:类的简单介绍(六)——初始化列表_第4张图片

 2、不论是什么成员变量都会先去初始化列表内部寻找数值,哪怕初始化列表内部没有这个成员变量,如果不在声明上给予缺省值,初始化列表会随机给予随机值。

C++:类的简单介绍(六)——初始化列表_第5张图片

或者在初始化列表的括号内部添加数值,注意的是声明给的是缺省值,初始化列表给的是初始化数值,当没有初始化数值有缺省值时,数值在内部也没有修改时,用的就算缺省值 

3、赋值的顺序:先默认数值,在进行初始化数值部分,最后进入二次修改数值

C++:类的简单介绍(六)——初始化列表_第6张图片

必须进行初始化的变量 

 1、const 修饰的变量

C++:类的简单介绍(六)——初始化列表_第7张图片

普通的初始化无法对const 修饰的变量进行初始化! 

C++:类的简单介绍(六)——初始化列表_第8张图片

成员变量只是声明,只有在主函数部分定义了对象,那些声明的成员变量才会进行初始化

但是呢,有一些成员必须要在主函数部分定义,才能够进行初始化

就例如const 修饰的变量成员!因为const只有一次修改的机会,也就是初始化的那次!

2、被&修饰的变量  引用 

因为引用必须在定义的时候进行初始化! 来自引用的使用规则 :

int & c = 1;正确 但是 int &c ;错误! 

C++:类的简单介绍(六)——初始化列表_第9张图片

3、自定义类型,且没有默认构造函数的成员变量必须走初始化列表 

C++:类的简单介绍(六)——初始化列表_第10张图片

关于自定义类型的初始化列表,当自定义类型没有设置初始化列表时,自定义类型的初始化是根据它自身的默认构造函数进行初始化的,就如上图所示,类型A是有一个全缺省的默认构造函数!

自定义类型没有进行初始化,但是有默认构造函数,那么自定义类型的初始化就算默认构造函数的数值 

但是,自定义类型没有默认构造,且在初始化列表内部没有进行初始化赋值则编译器会报错! 

C++:类的简单介绍(六)——初始化列表_第11张图片

就如上图,并不是全缺省的参数,也没有无参的构造函数,而编译器也生成不了默认构造,所以类型A没有默认构造!

而当自定义类型没有默认构造时,可以在初始化列表中添加自定义类型的初始化值,解决自定义类型的初始化问题 

C++:类的简单介绍(六)——初始化列表_第12张图片

当然如果不想要自定义类型使用默认构造的数值,也可以在初始化列表上添加自定义类型所需要的初始化数值 

C++:类的简单介绍(六)——初始化列表_第13张图片

小总结: 

1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2. 类中包含以下成员,必须放在初始化列表位置进行初始化:

  • 引用成员变量
  • const成员变量
  • 自定义类型成员(且该类没有默认构造函数时) 

除了以上三类,其他的成员变量在初始化列表或者在函数体({}内部的)的使用影响都不是很大!但是还是建议使用初始化列表

函数体和初始化列表的灵活使用:

C++:类的简单介绍(六)——初始化列表_第14张图片

哪一些操作必须走函数体? 

1、检查: 

C++:类的简单介绍(六)——初始化列表_第15张图片

2、数组的连续赋值: 

 

C++:类的简单介绍(六)——初始化列表_第16张图片

注意事项:

  1. 初始化列表中的()内部的数值必须符合对应的参数和数值
  2. 是 先走初始化列表,在走函数体,如果有缺省值,但是没有初始化列表,并且函数体内部没有数值,那就是缺省值
  3. 而自定义类型,如果没有初始化列表,那就是走自定义类型的默认构造函数,然后再走函数体

坑点/面试题: 

C++:类的简单介绍(六)——初始化列表_第17张图片

按照正常的 ,给aa传值了一个1,随后1作为定义时的赋值传给了A (int a)中的a 随后,初始化_a1(a) ,拿到了a 而且a=1所以_a1 = 1 而_a2的数值来自于_a1所以_a2=1

C++:类的简单介绍(六)——初始化列表_第18张图片

但是答案并不是,原因是什么?

C++:类的简单介绍(六)——初始化列表_第19张图片

注意看,这里传值的时候,先传的是_a2

这里就算初始化列表比较坑的地方,就算它传值的顺序是声明时候的顺序,而不是初始化列表上面定义时变量的顺序

C++:类的简单介绍(六)——初始化列表_第20张图片 


C++:类的简单介绍(六)——初始化列表_第21张图片 

你可能感兴趣的:(C++,类,C++,c++初阶知识,c++,开发语言,初始化列表,初始化,类,构造函数)