计算机二级无法完成初始化,计算机二级:确保对象在使用之前被初始化

a7e715cf81a97ae22e6c93c20e83e502.png

我自己在写代码的时候也经常会遇到忘记初始化某对象的问题,而且这些错误比较难以调试,Meyers提出了一些避免这些错误的解决方法:

1.手工初始化所以内置类型:

这一条很好理解,对于int,enum等内置类型。

2.对于类类型等用户自定义的对象,使用成员初值列初始化所有的对象:

1 using namespace std;

2

3 class PhoneNumber{};

4 class Customer

5 {

6 public:

7    Customer(const string& name, const string& address,

8             const PhoneNumber& phone);

9 private:

10    string theName;

11    string theAddress;

12    PhoneNumber thePhone;

13    int usedTimes;

14 }

对于Customer类的构造函数定义,一般我们会这么写:

1 Customer::Customer(const string& name, const string& address, const PhoneNumber& phone)

2 {

3   theName = name;      //4   theAddress = address;//而不是初始化

5   thePhone = phone;

6   usedTimes = 0;

7 }

可是,在c++中,对不是内置型的对象的初始化都发生在进入构造函数之前,也就是说,在进行theName = name;赋值之前,theName就已经进行了初始化了,这个过程调用自己的默认构造函数。

紧接着有立刻进行了赋值操作,这样会造成额外的浪费,所以我们可以这样写构造函数:

1 Customer::Customer(const string& name, const string& address, const PhoneNumber& phone)

2   :theName(name),//成员初始化列

3    theAddress(address),

4    thePhone(phone),

5    usedTimes(0)//内置类型也一并初始化

6 {

7 }

使用了成员初始化列的方法,在进入构造函数体之前就进行了初始化,减少了赋值的开销,同时为了保持一致性,将内置类型也一并进行了初始化。

还有一点要记住:在成员初始化列中对变量的初始化次序是按照变量声明的次序的,也就是说,即使将上面的次序任意改变,也改变不了初始化次序,所以我们要尽可能地按照使用的顺序来声明变量!

3.在多个编译单元内的non-local static对象的初始化次序问题:

non-local static对象表示在程序执行过程中一直存在的对象,像类中声明的static变量,全局变量,而在普通函数中声明的static变量称为local static变量。

那么当有多个不同的编译单元(即存在于不同的文件中)时,对这些non-local static对象的初始化次序,在c++中,是不确定的,而且也没法确定!

当两个或多个文件中的non-local static对象发生关联时,问题就出现了。

解决方法就是使用了设计模式中的:Singleton单件模式,将对non-local static的访问移到函数中,将其转变为local static变量,确保其被初始化了再使用。

如果是多个non-local static对象互相之间都有关联,那对不起,是设计出了问题。

2829f2ca24f0d0090cbba57f30759f23.png

计算机二级:确保对象在使用之前被初始化.doc

下载Word文档到电脑,方便收藏和打印[全文共1301字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值