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成員,它沒有類內初始化器且其類型未顯示定義默認構造函數,則該類的默認構造函數被定義為刪除的
-
2017年3月計算機二級C語言考試摸底測試題
以下是yjbys考試網小編整理的2017年3月計算機二級C語言考試摸底測試題,希望對大家有所幫助,祝大家計算機二級考試順利通過。一、選擇題(每小題1分。)(1)程序流程圖中帶有箭頭的線段表示的是()。A.圖元關係B.數據流C.控制流D.調用關係(2)結構化程序設計的基本原則...
-
計算機C語言考點大全
C語言是世界上最流行、使用最廣泛的高級程序設計語言之一。下面小編整理了計算機C語言考點大全,希望對大家有幫助!【考點1】C程序C語言程序結構有三種:順序結構,循環結構(三個循環結構),選擇結構(if和switch)【考點2】main函數每個C語言程序中main函數是有且只...
-
c語言數組指針變量的説明和使用
導語:指針變量可以進行某些運算,那麼在運算中如何操作呢?讓我們瞭解一下C語言數組指針變量的説明和使用吧!數組指針變量的説明和使用指向數組的指針變量稱為數組指針變量。在討論數組指針變量的説明和使用之前,我們先明確幾個關係。一個數組是由連續的一塊內存單元...
-
在C語言中轉換時間的基本方法
本文主要介紹了在C語言中轉換時間的基本方法,分別是mktime()函數和localtime()函數的使用,供參考學習,感興趣的小夥伴們可以參考一下!想了解更多相關信息請持續關注我們應屆畢業生考試網!C語言mktime()函數:將時間轉換成經過的秒數頭文件:#include<time.h>定義函數:t...
相關文章
- TOEFL詞彙:accumulated
- 雅思閲讀模擬試題:Sun's fickle heart may leave us cold
- The world Cup Football Final英語作文
- C語言中的小數(float,double)
- 英語《Module 6 Unit 1 You can play football well》的教案設計
- C語言double和float 實例分析用法
- Cultural differences英語作文
- 英語短文:City Life Compared with Rural Life
- 英語美文:Olympic Fund Scratchcard Launched
- An easy but difficult choice英語作文