delete阻止拷貝

動機

有時我們不想對象可拷貝,比如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。這樣外部無法拷貝,但是友元和內部成員函數可以調用。

第二層阻止

也別定義了。這樣誰都不能用。

聲明但不定義是合法的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章