C++知识进阶之初始化

在使用任意对象之前,我们都需要保证其已经被初始化,否则也许会发生不可预见性错误,比如,我们在比较一个变量的时候,它只是被声明出来但是没有被初始化,那么就会发生报错。

C++中类对象的初始化发生在构造函数身上,我们知道构造函数的作用是:创建对象,并且为新对象赋初值。

构造函数:初始化的方式有两种:
1.构造函数内部赋值;
2.初始化列表;(高效,少调用赋值运算)

C++内置类型以外的其他任意自定义对象,初始化的重任就落在构造函数的身上,所以构造函数里面需要对,对象的每一个成员变量初始化,但是要严格区分初始化和赋值的区别。

这里介绍一个我们理想认为的初始化的构造函数,但实际却不是初始化,是赋值!!!这里的构造函数函数,调用过程是,首先调用了默认的构造函数,为每一个成员变量设置了初始值,然后再给这些成员变量赋予了一个新值,那么调用默认的构造函数这一操作就多此一举了,与我们设想不符。
在这里插入图片描述

如何优化这个构造所以这里需要初始化列表,
在这里插入图片描述

初始化列表有序:
基类的成员变量比子类的更早初始化,子类的成员实际初始化的顺序严格按照变量在头文件中声明的顺序执行,与初始化列表中的顺序无关。
所以,要防止变量之间相互调用,因初始化顺序而导致的问题。

没有缺省构造函数的类成员变量,引用和const修饰的成员必须使用初始化列表进行初始化。

静态对象:
静态对象,其寿命从被构造出来一直存活到程序终止,也就是说静态对象的析构函数会在main函数结束时自动被调用。
C++对定义于不同编译单元的静态全局对象的初始化相对次序没有明确定义。
所以,如果一个静态全局对象初始化时调用了另一个单元的静态全局对象,它所用到的这个对象也许并未被初始化,那么就会发生错误,这种问题如何解决?
解决方式:将每个静态全局对象放在自己的专属函数里面(该对象在此函数中被声明为static),这个函数返回一个指向这个静态全局对象的引用,如果要调用静态全局对象,直接调用这个函数即可,这样我们可以在函数内部给未初始化的对象初始化,这种方式就是“Singleton(单例)模式”的手法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值