c語言中default的用法
C語言是一門實踐性和動手能力要求很高的大學主幹課程,但是C語言實驗課的教學一直不受重視,教學效果也不太理想。下面小編就跟你們詳細介紹下c語言中default的用法,希望對你們有用。
c語言中default的用法如下:
一、類中的預設函式
a.類中預設的成員函式
1.預設建構函式
2.預設解構函式
3.拷貝建構函式
4.拷貝賦值函式
5.移動建構函式
6.移動拷貝函式
b.類中自定義的操作符函式
ator
ator&
ator&&
ator*
ator->
ator->*
ator new
ator
同時C++規定,一旦程式設計師實現了這些函式的自定義版本,則編譯器不會再自動生產預設版本。注意只是不自動生成預設版本,當然還是可手動生成預設版本的。當我們自己定義了待引數的建構函式時,我們最好是宣告不帶引數的版本以完成無參的變數初始化,此時編譯是不會再自動提供預設的無參版本了。我們可以通過使用關鍵字default來控制預設建構函式的生成,顯式地指示編譯器生成該函式的預設版本。比如:
classMyClass
{
public:
MyClass()=default; //同時提供預設版本和帶參版本,型別是POD的
MyClass(inti):data(i){}
private:
int data;
};
有些時候我們希望限制預設函式的生成。典型的是禁止使用拷貝建構函式,以往的做法是將拷貝建構函式宣告為private的並不提供實現,這樣當拷貝構造物件時編譯不能通過,C++11則使用關鍵字顯式指示編譯器不生成函式的預設版本。比如:
classMyClass
{
public:
MyClass()=default;
MyClass(constMyClass& )=;
......
}
當然,一旦函式被過了,那麼過載該函式也是非法的,該函式我們習慣上稱為刪除函式。
二、default和的其他用途
上面我們已經看到在類中我們可用default和修飾成員函式,使之成為預設函式或者刪除函式,在類的外面,default可以在類定義之外修飾成員函式,比如:
classMyClass
{
public:
MyClass()=default;
MyClass() &operator=(constMyClass& );
);
//在類的定義外用default來指明預設函式版本
inlineMyClass&MyClass::operator=(constMyClass& )=default;
還可以MyClass&MyClass::operator=(constMyClass& )=default;但是這種類外定義合成的成員就不是行內函數。
與=default 不同,=必須出現在函式的第一次宣告中。因為一個預設的`成員隻影響為這個成員生成的程式碼,因此=default 直到編譯生成程式碼時才需要,而編譯器必須早早知道一個函式是否是刪除的,以便禁止試圖使用它的操作。
一般情況下,解構函式不能定義為刪除的,因為如果解構函式被刪除,就無法刪除此型別的物件了。對於一個刪除了解構函式的型別,編譯器將不允許定義該型別的變數或建立該型別的臨時物件,而且如果一個類有某個成員的型別刪除了解構函式,也不能定義該類的變數或臨時物件,因為一個成員的解構函式是刪除的,則該成員無法銷燬,包含它的類也就沒法銷燬。雖然對於刪除了解構函式的型別,我們不能定義這種型別的變數或成員但可以動態分配這種型別的物件,比如:
StructNoDtor{
NoDtor()=default;
~NoDtor()=default;
};
NoDtor *P=new NoDtor();//正確,但是我能 P
但是有時解構函式也是可以的,這樣做的目的是我們在指定記憶體位置進行記憶體分配時並不需要解構函式來完成物件級別的清理,這時我們可顯示刪除解構函式來限制自定義型別在棧上或者靜態的構造。
關於的顯式刪除,並非侷限於成員函式,比如:
voidFunc(inti){};
void Func(char c)=; //顯式刪除char版本
int main()
{
Func(3);
Func('c’); //無法編譯通過
return 0;
}
這裡因為Func的char版本已經被刪除,故Func('c')會編譯失敗。由此我們也知default是隻侷限作用於類的部分成員函式的。於是我們還可用來避免不必要的隱式資料型別轉換。比如:
classMyClass
{
public:
MyClass(inti){};
MyClsss(char c)=; //刪除char版本的建構函式
};
void Fun(MyClass m){}
int main()
{
Func(3);
Func('a'); //編譯不能通過
MyClassm1(3);
MyClass m2('a'); //編譯不能通過
}
這是因為char版本的建構函式被刪除後,試圖從char構造MyClass物件的方式是不允許的了。但去掉這句的函式刪除後,編譯器會隱式的將a轉換為整型使得編譯通過,呼叫的是整型建構函式,這可能並不是你所想要的。
但是如果這樣:
classMyClass
{
public:
MyClass(inti){};
explicit MyClsss(char c)=; //刪除explicit的char版本的建構函式
};
void Fun(MyClass m){}
int main()
{
Func(3);
Func('a'); //編譯可通過
MyClassm1(3);
MyClass m2('a'); //編譯不能通過
}
將建構函式explicit後,建構函式一樣的還是不能發生char的構造,因為char構造版本被刪除了,但在Func的呼叫中,編譯器會嘗試將c轉換為int,即Func(a')會呼叫一次MyClass(int )構造,順利通過編譯。於是我們不提倡explicit和混用。對與普通函式也有型別的效果。
的用法還包括刪除operator new操作符,編碼在堆上分配該類的物件
如:void* operator new(std::size_t)=;
合成的拷貝控制成員可能是刪除的,如果一個類有資料成員不能預設構造、拷貝、複製或銷燬,則對應的成員函式將被定義為刪除的。因此:
如果類的某個成員的解構函式是刪除的或不可訪問的,那麼類的合成解構函式被定義為刪除的。
如果類的某個成員的拷貝建構函式是刪除的或不可訪問的,則類的合成拷貝建構函式也被定義為刪除的。
如果類的某個成員的拷貝賦值運算子是刪除的或不可訪問的,或是類有一個const的或引用成員,則類的合成拷貝賦值運算子被定義為刪除的。
如果類的某個成員的解構函式是刪除的或不可訪問的,或是類有一個引用成員,它沒有類內初始化器,或是類有一個const成員,它沒有類內初始化器且其型別未顯示定義預設建構函式,則該類的預設建構函式被定義為刪除的
-
C語言程式基礎練習題帶答案
C語言傳遞引數均是以值傳遞(passbyvalue),另外也可以傳遞指標(apointerpassedbyvalue)。下面是小編為大家搜尋整理的C語言專項訓練題,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!單選題1).下列關於識別符號的說法中錯誤的是A.合法的識別符號...
-
C語言在螢幕中顯示內容
C語言你瞭解多少呢?你知道C語言在螢幕中顯示內容是什麼樣的嗎?歡迎大家閱讀!更多相關資訊請關注相關欄目!我們有兩種方式從計算機獲得資訊:一是看螢幕上的文字、圖片、視訊等,二是聽從喇叭發出來的聲音。讓喇叭發出聲音目前還比較麻煩,我們先來看看如何在螢幕上顯示一...
-
C語言基礎迴圈結構
引導語:迴圈結構可以減少源程式重複書寫的工作量,用來描述重複執行某段演算法的問題,這是程式設計中最能發揮計算機特長的程式結構。以下是本站小編分享給大家的C語言迴圈結構,歡迎閱讀學習!1.1for迴圈結構迴圈語句的一般表示式是:for(表示式1;表示式2;表示式3)語句2....
-
C語言猴子吃桃問題
猴子第一天摘了若干個桃子,當即吃了一半,還不解饞,又多吃了一個;第二天,吃剩下的桃子的一半,還不過癮,又多吃了一個;以後每天都吃前一天剩下的一半多一個,到第10天想再吃時,只剩下一個桃子了。問第一天共摘了多少個桃子?分析:1)設x1為前一天桃子數,設x2為第二天桃子數,則:x...
相關文章
- Cultural differences英語作文
- TOEFL詞彙:accumulated
- C語言中的小數(float,double)
- 英語短文:City Life Compared with Rural Life
- C語言double和float 例項分析用法
- 雅思閱讀模擬試題:Sun's fickle heart may leave us cold
- 英語《Module 6 Unit 1 You can play football well》的教案設計
- The world Cup Football Final英語作文
- An easy but difficult choice英語作文
- 英語美文:Olympic Fund Scratchcard Launched