条款 04:确定对象在使用之前已经被初始化

1.内置类型初始化

int x ;

在某些语境下x被初始化为0,在其他语境下不保证。

在某些平台甚至读取未初始化的值,就会停止运行。

2.自定义类型初始化

自定义类型的初始化责任落在,构造函数身上,构造函数要把对象的每一个成员都初始化。

不要混淆初始化和赋值

class PhoneNumber
{
public:
    PhoneNumber(const string &name, const string &adress)//构造函数
    {
        theName = name;//赋值并非初始化
        theAdress = adress;//赋值并非初始化
    }

private:
    string theName;
    string theAdress;
};

虽然这样仍然会得到你想要的初始值,并非是最佳做法。

C++规定,成员变量的初始化应该在进入构造函数之前。

构造函数最佳的做法,是用初始化列表替换赋值操作

class PhoneNumber
{
public:
    PhoneNumber(const string &name, const string &adress)
        :theName(name)
        ,theAdress(adress)
    {}

private:
    string theName;
    string theAdress;
};

第一版的代码,默认构造函数的初始化列表,已经将theName和theAdress,设置初值,然后又立刻为其赋新值,浪费了默认构造。

对于大多数类型,直接用初始化列表对其初始化,是比先初始化再赋值的效率更高的。

3.static对象初始化

某个A.cpp文件的非本地静态变量初始化,需要用到另一个B.cpp文件的非本地静态变量。

那么A.cpp所用的非本地静态成员变量可能是未初始化的,因为C++对不同编译单元的非本地成员变量初始化次序没有明确定义。

我们可以把用到的非本地静态成员变量,放在一个函数中,返回一个引用指向对象,换句话说把非本地的静态变量,替换为本地的静态变量。

class FileSystem

{
        size_t numDisk() const;

};

extern FileSystem tfs;

FileSystem &tfs()

{

        static FileSystem fs;

        return fs;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值