總結 深入理解C 11 第2章

2021-10-11 14:43:11 字數 2735 閱讀 8387

之後總結

分為 (signed) long long (int) 和 unsigned long long (int)

在c++11中,標準要求long long整型可以在不同平台上有不同的長度,但至少有64位

llong_min 和 llong_max 和 ullong_min

c++11一共只定義了5種標準的有符號整型:signed char 和 short int 和 int 和 long int 和 long long int 每一種都有對應的無符號整數版本,並擁有相同的儲存空間大小

c++11標準允許編譯器擴充套件自有的所謂擴充套件整型(extended integer type)可比最長的標準整型還長

而由於c/c++是一種弱型別語言,當運算、傳參等型別不匹配的時候,整型間會發生隱式的轉換,這種過程通常被稱為整型的提公升(integralpromotion),提公升的規則如下:

1)長度越大的整型等級越高,比如long long int的等級會高於int。

2)長度相同的情況下,標準整型的等級高於擴充套件型別,比如long long int和_int64如果都是64位長度,則long long int型別的等級更高。

3) long long int和unsigned long long int的等級就相同。

*(在進行隱式的整型轉換的時候,一般是按照低等級整型轉換為高等級整型,有符號的轉換為無符號)

之後總結

assert巨集在程式執行時起作用,#error在編譯器預處理時起作用,static_assert在編譯時起起作用

static_assert

(std::is_default_constructible

::value,

"data structure requires default-constructible elements"

);

static_assert的斷言表示式的結果必須是在編譯時期可以計算的表示式,即必須是常量表示式。如果讀者使用了變數,則會導致錯誤

在c++中,程式設計師也可以定義巨集ndebug來禁用assert巨集

#include

// uncomment to disable assert()

// #define ndebug

#include

#include

intmain

(void

)

noexcept形如其名地,表示其修飾的函式不會丟擲異常

在c++11中如果noexcept修飾的函式丟擲了異常,編譯器可以選擇直接呼叫std::terminate()函式來終止程式的執行

比如乙個類析構函式不應該丟擲異常,那麼對於常被析構函式呼叫的delete函式來說,c++11預設將delete函式設定成noexcept,就可以提高應用程式的安全性

在c++11中,標準允許使用等號=或者花括號{}進行就地的非靜態成員變數初始化,就地使用圓括號初始化會編譯出錯

可以為同一成員變數既宣告就地的列表初始化,又在初始化列表中進行初始化,只不過初始化列表總是看起來「後作用於」非靜態成員。也就是說,初始化列表的效果總是優先於就地初始化的

對於非常量的靜態成員變數,c++11則與c++98保持了一致。程式設計師還是需要到頭檔案以外去定義它,這會保證編譯時,類靜態成員的定義最後只存在於乙個目標檔案中

sizeof是乙個運算子,也是c語言中除了加減乘除以外為數不多的特殊運算子之一

在c++11中,對非靜態成員變數使用sizeof操作是合法的。而在c++98中,只有靜態成員,或者物件的例項才能對其成員進行sizeof操作

struct people

;int

main()

之後總結

乙個類a中宣告的虛函式fun在其派生類b中再次被定義,且b中的函式fun跟a中fun的原型一樣(函式名、引數列表等一樣),那麼我們就稱b過載(overload)了a的fun函式。對於任何b型別的變數,呼叫成員函式fun都是呼叫了b過載的版本。而如果同時有a的派生類c,卻並沒有過載a的fun函式,那麼呼叫成員函式fun則會呼叫a中的版本。這在c++中就實現多型

在通常情況下,一旦在基類a中的成員函式fun被宣告為virtual的,那麼對於其派生類b而言,fun總是能夠被過載的(除非被重寫了)。有的時候我們並不想fun在b型別派生類中被過載,編寫者如果要阻止派生類過載函式,只需要在定義時使用final進行修飾就可以了

struct object 

;struct base :

public object

;struct derived :

public base

;

基類virtual函式也可使用final,不過失去了virtual函式當意義

就是對於基類宣告為virtual的函式,之後的過載版本都不需要再宣告該過載函式為virtual。即使在派生類中宣告了virtual,該關鍵字也是編譯器可以忽略的

c++11引入了虛函式描述符override,如果派生類在虛函式宣告時使用了override描述符,那麼該函式必須過載其基類中的同名函式,否則**將無法通過編譯

struct a

;struct b : a

;

之後總結

之後總結

之後總結

深入理解C 11(九)

move語義 我們知道移動語義是通過右值引用來匹配臨時值的,那麼,普通的左值是否也能借助移動語義來優化效能呢,那該怎麼做呢?事實上c 11為了解決這個問題,提供了std move方法來將左值轉換為右值,從而方便應用移動語義。move是將物件的狀態或者所有權從乙個物件轉移到另乙個物件,只是轉移,沒有記...

深入理解C 11(十二)

改進物件池模式 物件池對於建立開銷比較大的物件來說很有意義,為了避免重複建立開銷比較大的物件,可以通過物件池來優化。物件池的思路比較簡單,事先建立好一批物件,放到乙個集合中,每當程式需要新的物件時,就從物件池中獲取,程式用完該物件後都會把該物件歸還給物件池。這樣會避免重複建立物件,提高程式效能。物件...

深入理解C 11(十五)

emplace back減少記憶體拷貝和移動 emplace back能就地通過引數構造物件,不需要拷貝或者移動記憶體,相比push back能更好地避免記憶體的拷貝與移動,使容器插入元素的效能得到進一步提公升。在大多數情況下應該優先使用emplace back來代替push back。所有的標準庫...