C++ 11:delete關鍵詞和一條《Effective C++》的過時條款
阿新 • • 發佈:2019-01-01
在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掉的成員函式不但無法呼叫,而且也不能被子類繼承和覆蓋。