1. 程式人生 > 其它 >c++ primer 第五版隨筆

c++ primer 第五版隨筆

1、what is std::endl ?

for example,

std::cout << "hello world" << std::endl;

std::endl是一個函式模板,在這裡作為一個函式名,即函式的地址,其為std::ostream operator <<(PFUNC func)的引數,即func即為std::endl, 在operator << 內部呼叫func(*this),一是用來列印換行符\n,二是用來重新整理輸出緩衝區。

2、what is the difference between sd::cout and std::cerr ?
std::cout 有一個輸出緩衝區,從輸出緩衝區列印到關聯裝置(一般是顯示器)

std::cerr 無輸出緩衝區,直接列印到關聯裝置(一般是顯示器)

3、data type of cpp

.... 

wchar_t   4 bytes in gcc 8.3

char16_t   2 bytes in gcc 8.3

char32_T  4 bytes in gcc 8.3

4、頂層const 和 底層const

int * const p = &i;   其中p是頂層const,不允許改變p的指向(即不允許改變p的值)

const int *p = &i; 其中p是底層const,不允許改變p指向的記憶體單元的值,即 *p = value 是錯誤的!!!

特別的:對const物件取地址的指標是一種底層const指標;

推導auto型別時,等號右邊的變數的頂層const屬性通常被忽略, 底層const屬性保留;

推導auto引用型別時,等號右邊的頂層const屬性需要保留,底層const屬性也需要保留;

5、decltype

如果decltype(x)中,x是一個變數,那麼該decltype表示式返回的該變數的型別包含頂層const和引用;

如果decltype(*p),其中p是一個指標,那麼解引用的結果是一個引用,所以decltype(*p) 的型別為一個引用型別;

如果decltype((x)),那麼如論x是什麼,使用括號的結果一定是引用;

如果decltype(陣列),那麼結果型別仍然是陣列,而非陣列地址或首元素地址;

即  decltype(value)的結果取決於value是什麼,是引用還是非引用;則 decltype((value))的結果一定是引用。

6、標頭檔案

C語言風格 name.h

C++風格  cname  建議使用此種方式 

7、存在陣列的引用,但不存在引用陣列

8、函式過載

函式的引數中,頂層const不能區分不同引數,即 func(int ) 和 func(const int) 是同一個函式;

而底層const則可以區分不同函式引數,即 func(int&) 和  func(const int&) 是不同函式,底層const指標同理;

9、常量表達式constexpr

修飾函式時,該函式必須有非void型別返回值;

constexpr函式的返回值型別和形參型別都必須是字面值型別,函式體中有且只有一條return語句。

與const不同, constexpr int* p ,該指標p是一個頂層const指標;

 10、shared_ptr

auto p = std::make_shared<T>(new T(params));

auto q = p; 引用計數為2

p.get()返回原始指標T*,但是不要這麼用

p.reset() 如果此時引用計數為0則釋放資源,否則只減少引用計數

p.reset(p2) 如果此時引用計數為0則釋放原來資源,否則只減少引用計數,然後重新管理p2所指向的資源,引用激素加1;

陣列:auto p = make_shared<T[]>(new T[10]{xxxx}, [](T* p){delete[] p;})   型別為T[]  必須為其指定一個記憶體刪除器;

不可以通過原始指標隱式轉換為shared_ptr ,即 shared_ptr<T> p = new T(params) 是錯誤的! 應該是 shared_ptr<T> p(new T(params)) 或者 make_shared<T>(new T(params))

11、unique_ptr

獨佔資源

auto p = unique_ptr<T>(new T(params))

p.release()釋放資源控制權(但是資源本身並不管),返回空指標,p為空

p.reset() 釋放資源

p.reset(T*) 釋放原有資源,重新獨佔T*

特殊:p.reset(nullptr)釋放資源

陣列:與shared_ptr不同,不需要指定刪除器,即 auto p = unique_ptr<T[]>(new T(params)),預設用delete[] 刪除記憶體;

12、解構函式

如果一個類中定義了解構函式,那麼它也同樣需要拷貝構造和賦值構造,同時編譯器不會再為其生成預設的移動move操作函式;

13、const和constexpr

const表示為【只讀】,constexpr表示為【常量】