條款05: 瞭解c++默默編寫並呼叫哪些函式

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

1. 如果沒有宣告任何建構函式,編譯器會為你宣告一個default建構函式
2. 惟有default建構函式被需要,才會被編譯器建立出來

class Empty
{
public:
    Empty() {}//1. 預設構造
    ~Empty() {} //2. 解構函式
    Empty(const Empty& rhs) {} //3. copy構造
    Empty& operator=(const Empty& rhs) {} //4. copy賦值
};

1. 宣告瞭建構函式,編譯器於是不再為它建立default建構函式
2. 內建型別預設複製構造,每個成員變數對應初始化
3. 內建型別預設複製賦值基本於預設複製構造一致
4. 對於成員變數為引用型別或const型別,拒絕生成預設複製構造和賦值

template<typename T>
class NameObject
{
public:
    NameObject():
        nameValue(),objectValue()
    {}
    NameObject(const std::string& name, const T& value) :
        nameValue(name), objectValue(value)
    {}
    const std::string& NameValue()const
    {
        return nameValue;
    }
private:
    //std::string& nameValue; //拒絕生成
    //const std::string nameValue; //拒絕生成
    std::string nameValue;
    T objectValue;

};

void Test00()
{
    NameObject<int> no1("Smallest Prime Number", 2);
    NameObject<int> no2(no1); //呼叫預設複製構造
    std::cout << no2.NameValue() << std::endl;
    NameObject<int> no3;
    no3 = no1; //呼叫預設複製賦值
    std::cout << no3.NameValue() << std::endl;
}

相關文章