C 11 新特性解析與應用》 讀書筆記

2021-07-03 13:34:13 字數 3767 閱讀 9746

__cplusplus 其實被定義為乙個整數 , c++03 中被定義為199711l , c++11 中被定義為201103l .

可以通過下面的**檢測編譯器是否支援c++11 .

#if __cplusplus < 201103l

#error "should use c++11 implementation"

#endif

列舉的作用域即是它所在的namespace, 有是他的父 作用域 。

例子 :

enum

type

;type t1 = general; // correct

type t2 = type::general ; // also correct

c++98 的sizeof不能使用非static的類成員作為引數, c++ 11 則可以 .

例子 :

class test

;#include

using

std::cout;

using

std::endl;

int main()

c++11的friend 關鍵字不必再寫class .

支援模板作為friend. 如果模板的例項化是乙個基本型別, 那麼就忽略這個友元.

例子

template

class test

;class friendclass ;

typedef testnofriend test ;

typedef testhasfriend test;

對於虛函式(非純虛) , 使用final關鍵字可以阻止派生類過載繼續這個介面.

例子:

#include 

using std::cout;

using std::endl;

class grandpa

;class father : public grandpa

//error: overriding final function 『virtual void father::print()』

};

使用override關鍵字修飾函式, 指明這個函式是過載了父類的介面, 如果不是,則會編譯出錯 .

例子:

class father

};class son : public father

//error: 『virtual void son::aa()』 marked override, but does not override

};

支援帶有預設 值/型別 的函式模板.

支援外部(extern) 模板

支援區域性/匿名型別作為模板實參, 但是這個區域性/匿名型別的宣告不能出現在模板實參位置.

具體例子請自習查閱書籍.

繼承建構函式的

用途:

1.1.1 父類的建構函式眾多

1.1.2 派生類新增的資料項較少, 可以通過指定預設值(c++11) 的方式初始化

注意:

1.2.1 多重繼承的時候注意建構函式衝突問題

委派建構函式

用途 2.1.1 各種建構函式有部分相同的工作

2.1.2 在初始化列表中使用, 類似父類建構函式的使用

注意:

2.3 注意不應該產生環狀依賴

例子 :

#include 

using

std::cout;

using

std::endl;

class father

// 委派給只有乙個引數的建構函式 .

father(int i) : father(i,2){} // 委派給最詳細賦值的建構函式 .

father(int i, int j) : a(i) , b(j){}

void print() ;

class son : public father

;int main()

// c++98 error , c++11 pass 

int a = ;

int b ;

vector

c(1,2,3);

int i = 1024;

int j = 10 ;

char c = ; // error , narrowing and miss data

char c = ; // pass , narrowing but no data miss.

右值 , 右值引用 , 移動語義 , std::move

右值引用t &&

移動建構函式t( t && )

移動語義在需要深層拷貝的類有巨大作用(不必重新開闢記憶體).

理論上t( const t && )是可以的 , 但是沒有意義, 移動語義決定了我們應該去改變這個右值 .

std::move(a)返回a轉化為的右值 , 但是a本身並沒有消亡,a變數被移動函式改變過之後, 或許資料已經混亂, 不應該繼續作為普通左值使用.

template< class t> 

void iamforwarding< t && t>

自定義字面值

定義函式 :

t operator ""_x( p ) {}

其中t為目標類,_x為字面值字尾 ,p" "部分的型別 , 作為引數傳入(整形 , 浮點 , 字元) .

例子 :

struct walt  

walt operator

""_w(unsigned

int v)

; return w;

}int main()

auto 自動型別推導

如果你不像寫aaa:::bbb:::ccc::ddd i = gen***();, 試一試auto i = gen***();.

decltype 提取型別

int i;

decltype(i) j ; // 提取i的型別來定義j

#### 列舉

enum class *** : ***[ int , char , long … ] ;

auto

慢慢學習~~

《深入理解C 11 新特性解析與應用》 讀書筆記

第六章 在 c 11中,nullptr 是乙個所謂的 指標空值型別 的常量,指標空值型別被命名為nullptr t。nullptr 是有型別的,且可以被隱式地轉化為指標型別。第二章異常機制會帶來一些額外開銷,比如函式丟擲異常,會導致函式棧被依次地展開,並依幀呼叫在本幀中已構造的自動變數的析構函式等。...

C 11新特性解析與應用 lambda部分

lambda 的 方式,根據lambda的實現知道 方式為傳值,在lambda定義的時候,初始化狀態就確定了 方式為引用,那麼引用的物件或者變數,會根據lambda執行的時候,再確定初始化狀態 這一點很重要 我們可以用 typeid lambda name 來看看不同編譯器,對於lambda的型別到...

C 11特性 《深入理解C 11 讀書筆記

新增關鍵字 struct alignas 32 colorvector 沒有alignas關鍵字的話,對齊到8位,加上的話,對齊到32位,能提公升效率。對齊的資料在讀寫上會有效能上的優勢。比如頻繁使用的資料如果與處理器的快取記憶體器大小對齊,有可能提高快取的效能。而資料不對齊可能造成一些不良的後果,...