【指標空值——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 注意 如果派生類有多個基類時有可能導致衝突,解決辦法是派生類顯示定義該建構函式 用處 一些建構函式需要呼叫相同的 類似的 段時,可將該...