1. 程式人生 > >C++ 11:delete關鍵詞和一條《Effective C++》的過時條款

C++ 11:delete關鍵詞和一條《Effective C++》的過時條款

在Scott Meyers的名著《Effective C++》中的條款5(瞭解C++默默編寫並呼叫了哪些函式)和條款6(若不想使用編譯器自動生成的函式,就應該明確拒絕)中提到以下幾點:
以一個簡單的類為例:

class base{
public:
};

在沒有定義任何建構函式的情況下
1、編譯器會自動生成default建構函式
2、編譯器會自動生成copy建構函式
3、編譯器會自動過載copy assignment操作符
4、編譯器會自動生成解構函式

也就是自動生成了以下的程式碼:

class base{
public:
    //default建構函式
    base
() {} //拷貝建構函式 base(const base &rhs){} //解構函式 ~base(){} //過載‘=’運算子 base& operator=(const base& rhs){} };

有的時候我們並不想使用編譯器自動生成的函式,於是在《Effective C++》條款6中,採用了以下的方式杜絕編譯器自動生成的函式。

class base{
public:
    ...
private:
    //如果我們要拒絕過載‘=’運算子,就把它設定為私有
    base& operator=(const base& rhs){}
};

但是在C++11中,我們有了更好的杜絕編譯器自動生成的函式的方式:delete

class base{
public:
    ...
    //如果我們要拒絕過載‘=’運算子的預設函式,加上=delete即可
    base& operator=(const base& rhs)=delete;
};

int main(){
    base ba;
    base bb;
    ba = bb; //會出錯,operator=過載已經被delete
}

被delete掉的成員函式不但無法呼叫,而且也不能被子類繼承和覆蓋。