C default 和delete的新用法

2021-09-08 12:16:36 字數 2145 閱讀 6419

c++中的預設函式與default和delete用法

一、 類中的預設函式

a.類中預設的成員函式

1.預設建構函式

2.預設析構函式

3.拷貝建構函式

4.拷貝賦值函式

5.移動建構函式

6.移動拷貝函式

b.類中自定義的操作符函式

1.operator

2.operator&

3.operator&&

4.operator*

5.operator->

6.operator->*

7.operator new

8.operator delete

同時c++規定,一旦程式設計師實現了這些函式的自定義版本,則編譯器不會再自動生產預設版本。注意只是不自動生成預設版本,當然還是可手動生成預設版本的。當我們自己定義了待引數的建構函式時,我們最好是宣告不帶引數的版本以完成無參的變數初始化,此時編譯是不會再自動提供預設的無參版本了。我們可以通過使用關鍵字default來控制預設建構函式的生成,顯式地指示編譯器生成該函式的預設版本。比如:

class myclass

private:

int data;

};有些時候我們希望限制預設函式的生成。典型的是禁止使用拷貝建構函式,以往的做法是將拷貝建構函式宣告為private的並不提供實現,這樣當拷貝構造物件時編譯不能通過,c++11則使用delete關鍵字顯式指示編譯器不生成函式的預設版本。比如:

class myclass

當然,一旦函式被delete過了,那麼過載該函式也是非法的,該函式我們習慣上稱為刪除函式。

二、default和delete的其他用途

上面我們已經看到在類中我們可用default和delete修飾成員函式,使之成為預設函式或者刪除函式,在類的外面,default可以在類定義之外修飾成員函式,比如:

class myclass

;void func(char c)=delete; //顯式刪除char版本

int main()

這裡因為func的char版本已經被刪除,故func('c')會編譯失敗。由此我們也知default是只侷限作用於類的部分成員函式的。於是我們還可用delete來避免不必要的隱式資料型別轉換。比如:

class myclass

;myclsss(char c)=delete; //刪除char版本的建構函式

};void fun(myclass m){}

int main()

這是因為char版本的建構函式被刪除後,試圖從char構造myclass物件的方式是不允許的了。但去掉這句的函式刪除後,編譯器會隱式的將a轉換為整型使得編譯通過,呼叫的是整型建構函式,這可能並不是你所想要的。

但是如果這樣:

class myclass

;explicit myclsss(char c)=delete; //刪除explicit的char版本的建構函式

};void fun(myclass m){}

int main()

將建構函式explicit後,建構函式一樣的還是不能發生char的構造,因為char構造版本被刪除了,但在func的呼叫中,編譯器會嘗試將c轉換為int,即func(\\a')會呼叫一次myclass(int )構造,順利通過編譯。於是我們不提倡explicit和delete混用。對與普通函式delete也有型別的效果。

delete的用法還包括刪除operator new操作符,編碼在堆上分配該類的物件

如:void* operator new(std::size_t)=delete;

合成的拷貝控制成員可能是刪除的,如果乙個類有資料成員不能預設構造、拷貝、複製或銷毀,則對應的成員函式將被定義為刪除的。因此:

如果類的某個成員的析構函式是刪除的或不可訪問的,那麼類的合成析構函式被定義為刪除的。

如果類的某個成員的拷貝建構函式是刪除的或不可訪問的,則類的合成拷貝建構函式也被定義為刪除的。

如果類的某個成員的拷貝賦值運算子是刪除的或不可訪問的,或是類有乙個const的或引用成員,則類的合成拷貝賦值運算子被定義為刪除的。

如果類的某個成員的析構函式是刪除的或不可訪問的,或是類有乙個引用成員,它沒有類內初始化器,或是類有乙個const成員,它沒有類內初始化器且其型別未顯示定義預設建構函式,則該類的預設建構函式被定義為刪除的

delete和delete 的區別

剛才在寫一段例子程式的時候,發現對於乙個指標型別的陣列t p,delete p和delete p的效果一樣。看了一下c primer和c programming language都沒有找到解釋,於是在網路上搜尋一下,發現了很好的解釋。整理一下 c 告訴我們在 用 new 分配的單個物件的記憶體空間的...

delete和delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。樓主的這個問題提得很好。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型...

關於delete 和 delete 二

3.下面我們來看看上面提到的4位元組是幹什麼用的。int main 執行結果 adress after malloc 0x804a008 size 104 a a adress after new 0x804a00c number of a at 0x804a008 100 size of a at...