C 11學習筆記 五

2021-07-05 16:54:39 字數 2547 閱讀 9809

【指標空值——nullptr】

#include using namespace std;

void f(char* c)

void f(int i)

int main()

本程式中,null被定義為0,這裡引發錯誤的原因是 c++98中,0既可以是乙個整形,也可以是乙個(void*)指標。如果想要呼叫f(char* c)版本,就必須進行強制轉換。

f((char*)0);
c++11標準中,因為要保持相容性,所以並沒有消除上面情形的二義性,而是引入了關鍵字nullptr——其實質是乙個nullptr_t型別的常量,定義如下

typedef decltype(nullptr) nullptr_t;
使用nullptr_t時,必須#include,而nullptr則不用。

正是由於nullptr是有型別的,使用它來替代null可以使得**更加健壯。

#include using namespace std;

void f(char *p)

void f(int)

int main()

**準確的表達了程式設計師的意圖。

下面來看一些nullptr_t的一些規則

所有nullptr_t型別的資料都是等價的,行為也是完全一致;

nullptr_t型別可以隱式轉換成任意乙個指標型別、不適用於算術運算表示式等。

下面的**集合了大多數場景

#include #include using namespace std;

int main()

執行結果如下

最後說說 nullptr_t在模板中的應用。

#include using namespace std;

templatevoid g(t* t) {}

templatevoid h(t t) {}

int main()

雖然nullptr_t是乙個指標型別,但在模板中,仍把它當作乙個普通型別來推導。

【預設函式的控制】

在c++中宣告自己的類,編譯器會為我們生成一些自定義的函式,這些函式被稱為預設函式。比如預設的建構函式、複製建構函式、析構函式等。

一旦我們寫了這些函式自己的版本,則編譯器不再為我們生成預設版本,如此一來,將導致我們自定義的類不再是pod型別。

#include #include using namespace std;

class twocstor ;

twocstor(int i): data(i) {}

private:

int data;

};int main()

c++11中,重用了default這個關鍵字,可以通過它顯式指示編譯器生成它的預設版本。

#include #include using namespace std;

class twocstor

private:

int data;

};int main()

有時候,我們希望能夠限制一些預設函式的生成。比如,需要禁止複製建構函式被呼叫。在c++98中,通常通過將其訪問級別設為private。

#include #include using namespace std;

class nocopycstor ;

};int main()

在c++11中,引入了更為簡單的方法——在函式的定義或宣告中加上「=delete」。

#include #include using namespace std;

class nocopycstor ;

int main()

注意,一旦預設版本被刪除,即便是過載該函式也是非法的。

「=default」不僅能被用在成員函式上,在類的外部也可以使用

class defaultedoptr;

// 在類定義外用"= default"來指明使用預設版本

inline defaultedoptr &

defaultedoptr::operator =( const defaultedoptr & ) = default;

顯式刪除 「=delete」可以避免編譯器做一些不必要的隱式資料型別轉換。

class convtype ;

convtype(char c) = delete; // 刪除char版本

};void func(convtype ct) {}

int main()

c 11學習筆記

c 98的 std auto ptr已經被徹底遺棄了,取而代之的是unique ptr shared ptr與weak ptr。大部分時候我們自己手動申請記憶體方式記憶體都是沒有問題的,問題是如果程式很大了之後,乙個複雜的物件,多次拷貝的代價非常高,很多地方都會使用到,只存在乙份拷貝顯然是最好的,這...

C 11學習筆記 Type Support

其實主要還是對c 的std庫的學習吧,雖然用的不少但是對c 的全貌還不太了解。主要包括3個部分 基本型別 rtti 萃取技術 traits size t 用的太多了,不說了。ptrdiff t 乙個有符號的型別,通常用來表示兩個指標相減的結果,是乙個機器相關的型別。和size t不同的是,size ...

C 11學習筆記二

用處 基類擁有眾多建構函式而派生類只有一些成員函式 資料不多 時,可以直接繼承基類建構函式而不必重寫。用法 class base class derive base 注意 如果派生類有多個基類時有可能導致衝突,解決辦法是派生類顯示定義該建構函式 用處 一些建構函式需要呼叫相同的 類似的 段時,可將該...