動機
有時我們不想對象可拷貝,比如iostream對象,可能想到的方式是不去定義,但賦值運算符和拷貝構造函數編譯器幫我們默認定義了。只能顯式說明一下。
struct noCopy
{
noCopy() = default;
noCopy(const noCopy&) = delete;
noCopy& operator=(const noCopy&) = delete;
~noCopy() = default;
};
與default不同之處
可以用於任何函數,比如禁止某種匹配,而default只能用於系統默認合成的函數。
析構函數不能是刪除的
假如析構函數刪除,就不能定義對象;但是可以new對象,但不能delete對象。估計new時不做delete檢查。
struct noDelete
{
noDelete() = default;
~noDelete() = delete;
};
int main() {
noDelete nd; //xxx
noDelete *nd1 = new noDelete();
delete nd1; //xxx
}
有時合成的函數編譯器給你弄成delete
析構刪除
1.某個成員的析構函數爲刪除或不可訪問,就把類的析構也弄成刪除的。 //因爲成員刪不了
合成拷貝構造函數刪除
1.某個成員的拷貝構造函數爲刪除或不可訪問。 //因爲成員不可拷貝
2.某個成員的析構函數爲刪除或不可訪問。 //防止內存爆了吧
合成賦值運算符刪除
1.某個成員的賦值運算符爲刪除或不可訪問。
2.有const成員。 //因爲這些成員賦新值。
3.有引用成員。 //因爲賦值運算符本意想指向同一個對象,但現在改的是值。
合成構造函數刪除
1.某個成員的構造函數是刪除或不可訪問。
2.有const成員,但沒有類內初始化且其沒有默認構造函數。(沒直接初始化的話應該初始化列表初始化) //所以必須傳參初始化,所以沒默認無參的了
3.有引用成員,但沒有類內初始化。(沒直接初始化的話應該初始化列表初始化) //所以需要傳參初始化
private的拷貝控制
作用
新標準沒出現前,就是用private阻止調用,這樣可以阻止拷貝。
第一層阻止
把拷貝構造函數定義了,但聲明爲private。這樣外部無法拷貝,但是友元和內部成員函數可以調用。
第二層阻止
也別定義了。這樣誰都不能用。
聲明但不定義是合法的。