初始化列表

一. 初始化列表是什么?

初始化列表是构造函数真正初始化的地方,不管你是否写了构造函数或者是否显示写了初始化列表,构造函数都会走初始化列表,进行对象的初始化;
简单的说:初始化列表就是构造函数真正进行初始化的地方!!!

二. 为什么要有初始化列表?

  1. 语法设置特性就是如此。
  2. 有三种情况必定需要初始化列表进行初始化。
  1. 拥有const 属性的常变量。因为const 初始化之后就不能变了。
  2. 引用类型的变量,因为引用特性初始化之后不能再变成别人的引用了。
  3. 没有默认构造的自定义成员变量。

三. 初始化列表的特性

  1. 初始化列表的使用方式:在构造函数口号后面先加一个 :(冒号),然后写成员变量,再在成员变量后面加括号,括号里面进行初始化,用逗号对后面的成员变量进行分割;
    在这里插入图片描述
  2. 构造函数的初始化顺序是跟成员变量的先后顺序是一样的,如上图所示:要是先定义变量a1,后定义a2,初始化列表就会先初始化a1,后初始化a2,反之就先初始化a2,后初始化a1;要是上图是后者,则a2是任意值,不确定的,因为a2是用a1初始化的,而a2先于a1初始化,这个时候a1还是任意值;
  3. 对于自定义类型和内置类型的区别:
  1. 要是显示写了初始化列表,则直接走初始化列表,不管是内置类型还是自定义类型;
  2. 要是没有显示写初始化列表,内置类型不做处理,自定义类型调用对应的构造函数;这里注意:要是自定义类型没有默认构造函数,编译报错!!!

四. explicit关键字

  1. 可以对一个参数的构造函数进行隐式类型转换,比如string的拷贝构造可以直接用一个字符串直接构造 如 string s = “hello world”;这样看上去想赋值重载,其实是拷贝构造,而且拷贝构造的参数是string类型,但是这里直接是字符串,这里就是会隐式类型转换,也可以参数是int类型的,直接传一个整数常量,也是一样的;
  2. 要是不要它进行隐式类型转换,在构造函数前面加上explicit关键字就可以禁止!!!

五. statis成员

  1. 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化(const修饰的整形类型可以用缺省值)
  2. statis成员是所有对象共享的,无论是成员变量还是成员函数;它是存放在静态区的。
  3. statis修饰的成员变量一定要类外初始化,不用加statis关键字,类中的只是声明。
  4. statis修饰的成员可以直接用类名::成员访问(前提是公有),因为它不在对象里;
  5. statis修饰的成员函数没有this指针,故不能访问具体对象的普通成员变量,只能访问statis修饰的成员变量。
  6. 静态成员同样受访问限定符的影响

六. 友元

  1. 友元分友元函数和友元类。
  2. 友元函数是普通函数,在类内任意地方,注意:是类内任意地方!!!将需要用私有和保护成员的普通函数前面加friend关键字的声明放在类内任意地方就行了。
  3. 一个函数可以是多个类的友元。
  4. 友元类是单向的,比如a类是b类的友元,则a类可以访问b类的所有成员,而b类还是只能访问a类的公有成员。
  5. 友元类不能传递,很好理解的,c是b的友元,b是a的友元,但是c不是a的友元。

七. 内部类

  1. 在类里面定义的类叫内部类。
  2. 内部类天然是外部类的友元。
  3. 我们可以看作内部类和两个定义在全局的类是一样的,sizeof(类名)大小是外部类的大小,跟内部类没有关系
  4. 只是访问内部类的时候会受外部类的范围限定符的影响。

八. 匿名对象

  1. 直接用 类名() 这样形式使用匿名对象,也就是没有对象名。
  2. 匿名对象只能在当前所在行使用!!!
  3. 如果是单参数构造,又可以使用隐式类型转换,简化到了极致。

九. 编译器优化

  1. string s = “hello world”,本来是先构造一个临时string,然后再拷贝构造的,编译器直接优化成用”hello world" 构造s。
  2. 传参的时候直接传一个string对象,第一个可以优化是直接传一个匿名对象,本来是要构造一个匿名对象,然后再拷贝构造参数,编译器直接用匿名对象的参数直接构造string。
  3. 还有一个就是返回值,返回值直接接收的话也会省掉中间拷贝构造,直接用返回值构造。

总结:

  • 语法确实杂和多,但是要理解它,不要背,坚持下去
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值