商務英語計算機英語

c語言中default的用法

本文已影響 2.72W人 

C語言是一門實踐性和動手能力要求很高的大學主幹課程,但是C語言實驗課的教學一直不受重視,教學效果也不太理想。下面小編就跟你們詳細介紹下c語言中default的用法,希望對你們有用。

ing-bottom: 75%;">c語言中default的用法
  C語言中的switch和default的意思

1.用於多分支選擇的switch語句, 其一般形式爲: switch(表達式){ case 常量表達式1: 語句1; case 常量表達式2: 語句2; … case 常量表達式n: 語句n; default: 語句n+1;}

ch 是分支語句,就是比較強大的if集;default爲不滿足所有的switch條件則後面的句子被執行。一般將default寫在switch中的最後

3.是否要使用deafult

不!但是爲了進行錯誤檢查或邏輯檢查,還是應該在switch語句中加入default分支。例如,下述switch語句完全合法:switch (char_code){ case tyt: case 'y': printf ( " You answered YES ! n" ) break case 'N': case 'n': printf ("You answered NO!n"); break}但是,如果一個未知字符被傳遞給這條switch語句,會出現什麼情況呢?這時,程序將沒有任何輸出。因此,最好還是加入一個default分支,以處理這種情況:ult: printf ("Unknown response : %dn", char_code); break......此外,default分支能給邏輯檢查帶來很多方便。例如,如果用switch語句來處理數目固定的條件,而且認爲這些條件之外的值都屬於邏輯錯誤,那麼可以加入一個default分支來辨識邏輯錯誤。

  c語言中default的用法:類中的默認函數

a.類中默認的成員函數

1.默認構造函數

2.默認析構函數

3.拷貝構造函數

4.拷貝賦值函數

5.移動構造函數

6.移動拷貝函數

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

ator

ator&

ator&&

ator*

ator->

ator->*

ator new

ator delete

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

classMyClass

{

public:

MyClass()=default; //同時提供默認版本和帶參版本,類型是POD的

MyClass(inti):data(i){}

private:

int data;

};

有些時候我們希望限制默認函數的生成。典型的是禁止使用拷貝構造函數,以往的做法是將拷貝構造函數聲明爲private的並不提供實現,這樣當拷貝構造對象時編譯不能通過,C++11則使用delete關鍵字顯式指示編譯器不生成函數的默認版本。比如:

classMyClass

{

public:

MyClass()=default;

MyClass(constMyClass& )=delete;

......

}

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

  c語言中default和delete的其他用途

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

classMyClass

{

public:

MyClass()=default;

MyClass() &operator=(constMyClass& );

);

//在類的定義外用default來指明缺省函數版本

inlineMyClass&MyClass::operator=(constMyClass& )=default;

還可以MyClass&MyClass::operator=(constMyClass& )=default;但是這種類外定義合成的成員就不是內聯函數。

與=default 不同,=delete必須出現在函數的第一次聲明中。因爲一個默認的成員隻影響爲這個成員生成的代碼,因此=default 直到編譯生成代碼時才需要,而編譯器必須早早知道一個函數是否是刪除的,以便禁止試圖使用它的操作。

一般情況下,析構函數不能定義爲刪除的,因爲如果析構函數被刪除,就無法刪除此類型的對象了。對於一個刪除了析構函數的類型,編譯器將不允許定義該類型的變量或創建該類型的臨時對象,而且如果一個類有某個成員的類型刪除了析構函數,也不能定義該類的變量或臨時對象,因爲一個成員的析構函數是刪除的,則該成員無法銷燬,包含它的類也就沒法銷燬。雖然對於刪除了析構函數的類型,我們不能定義這種類型的變量或成員但可以動態分配這種類型的對象,比如:

StructNoDtor{

NoDtor()=default;

~NoDtor()=default;

};

NoDtor *P=new NoDtor();//正確,但是我能delete P

但是有時析構函數也是可以delete的,這樣做的目的是我們在指定內存位置進行內存分配時並不需要析構函數來完成對象級別的清理,這時我們可顯示刪除析構函數來限制自定義類型在棧上或者靜態的構造。

關於delete的顯式刪除,並非侷限於成員函數,比如:

voidFunc(inti){};

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

int main()

{

Func(3);

Func('c’); //無法編譯通過

return 0;

}

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

classMyClass

{

public:

MyClass(inti){};

MyClsss(char c)=delete; //刪除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)=delete; //刪除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和delete混用。對與普通函數delete也有類型的效果。

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

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

合成的拷貝控制成員可能是刪除的,如果一個類有數據成員不能默認構造、拷貝、複製或銷燬,則對應的成員函數將被定義爲刪除的。因此:

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

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

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

如果類的某個成員的析構函數是刪除的或不可訪問的,或是類有一個引用成員,它沒有類內初始化器,或是類有一個const成員,它沒有類內初始化器且其類型未顯示定義默認構造函數,則該類的默認構造函數被定義爲刪除的


猜你喜歡:

1.c語言中include的用法

2.c語言的用法總結

3.c中for的用法

4.c語言中邏輯或的用法

5.c語言中putchar的用法

6.c語言中continue的用法

猜你喜歡

熱點閱讀

最新文章