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...