條款04: 確定物件被使用前已被初始化

博瑜图形發表於2024-09-07

1. 物件使用之前進行初始化

void Test00()
{
    int x = 0;
    const char* text = "A C-style string";
    double d;
    std::cin >> d;
}

1. 使用初始化列表進行初始化
2. baseClass的初始化早於derivedClass
3. class的成員變數總是以宣告的順序進行初始化,而不是在成員初值列中的順序

class PhoneNumber
{};

class ABEntry
{
public:
    ABEntry() :
        theName(), theAddress(), thePhones(), numTimesConsulted(0)
    {}
    ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones) :
        theName(name), theAddress(address), thePhones(phones),numTimesConsulted(0)
    {}
private:
    std::string theName;
    std::string theAddress;
    std::list<PhoneNumber> thePhones;
    int numTimesConsulted;
};

1. 初始化次序的重要性,tfs在tempDir之前先被初始化,否則tempDir的建構函式會用到尚未初始化的tfs
2. 定義並初始化一個local static物件,以免除"跨編譯單元之初始化次序"

class FileSystem
{
public:
    size_t numDisks()
    {
        return 1u;
    }
};
FileSystem& tfs()
{
    static FileSystem fs;
    return fs;
}

class Directory
{
public:
    Directory()
    {
        std::size_t disks = tfs().numDisks();
    }
};

Directory& tempDir()
{
    static Directory td;
    return td;
}

相關文章