標籤:
使用者自訂的標識符不能連續出現兩個底線, 也不能以底線緊連大寫字母開頭。 此外,定義在函數體外的標識符不能以底線開頭。
((試過在g++ 和 vc都可以正常使用, 這些其實是編譯器自己的實現。))
引用只是別名,
引用本身不是一個對象,所以不能定義引用的引用。(int &&rr = r; //error)
引用本身不是一個對象,因此不能定義指向引用的指標。(int &*p = &r; //error)
const char* p = "abc";
std::cout << cast_cast<const void*>(p); 這樣才能輸出指標的值,否則預設輸出指向的字串。
預設情況下下, const對象僅在檔案內有效。如果想在多個檔案之間共用const對象, 必須在
變數的定義之前加extern關鍵字。
file1.cpp extern const int bufSize = fcn();
file1.h extern int bufSize;
指標和constexpr (p60)
在constexpr聲明中如果定義了一個指標, 限定符constexpr僅對指標有效,與指標所指對象無關。
const int *p = nullptr; //p 是一個指向整形常量的指標
constexpr int *q = nullptr; //q是一個指向整數的常量指標
如果運算式的內容是解引用操作, 則decltype將得到參考型別。
decltype (*p) c; //錯誤, c是int&, 必須初始化。
decltype (&p) 的結果是 int**;
注意:decltype((v)) 的結果永遠是引用,而decltype(v)結果只有在v本身就是
一個引用的時候才是引用。
標頭檔不應包含using;它可能會被拷貝到其他引用它的檔案中,容易衝突。
difference_type 2個迭代器之間的距離。可正可負。
ptrdeiff_t\ size_t 定義在cstddef中。可正可負
要理解數組聲明的含義,最好的辦法是從數組名字開始按照由內向外的順序閱讀。(p103)
int *ip[4]; //整型指標的數組 ip是一個4個元素的數組,裡面放了都是int指標
int (*ip)[4]; //指向含有4個整數的數組 (ip是一個指標)指向有4個元素的數組,元素都是int型
常量對象,以及常量對象的引用或指標都只能調用常量成員函數。
explicit, 將之能以直接初始化的形式使用。
tie有2個重載版本,1不帶參數返回指向輸出資料流的指標,2版本接受一個ostream的指標,將自己關聯到此ostream。
容器中,如果元素類型沒有預設建構函式, 除了大小參數外,還必須制定一個顯式的元素初始值
std::array除了指定元素類型之外,還要指定容器大小。
std::array<int, 42> a;
std::array<int, 42>::size_type s;
erase 返回指向序列中的下一個元素。
insert 在給定位置之前插入新元素,然後返回指向新插入元素的迭代器。
對vector\string 等等容器插入、刪除都"容易"會引起迭代器失效!!
不要儲存 end();
fill_n(back_inserter(ivec), 10, 0);
lambda
[capture list] (param list) -> return type {function body}
=值捕獲、&引用捕獲。
ref(var); // 以引用的方式。。。
p426: 與unique_ptr不同, shared_ptr不支援直接管理動態數組,所以得自定刪除器。
shared_ptr<int> sp (new int[10], [](int *p) {delete []p;});
*(sp.get() + i) = n;
拷貝構造、 拷貝賦值運算子 的使用情境不同。
CA a = b; //拷貝構造;
a = b; //拷貝賦值運算子。
賦值運算子通常應該返回一個指向其左側運算對象的引用。
P516~P517頁的演算法不錯。
運算子多載:
前置++ -- ()
後置++ -- (int) 多了一個int來區分, 並不使用這個int,;-)
p490:
一元運算子有一個參數, 二元運算子有2個。對於二元運算子來說,左側運算對象傳遞給第一個參數,
而右側運算子傳遞給第二個參數。
如果一個運算子函數是成員函數, 則它的第一個(左側)運算對象綁定到隱式的this。
因此,成員運算子函數的(顯式)參數數量比運算子的運算對象總數少一個。
class CA final : public CBase {};
p535 如果在基類中含有一個或多個虛函數, 可以使用dynamic_cast請求一個類型轉換。
如果已知某個基類向衍生類別轉換是安全的,可以使用static_cast來強制覆蓋編譯器的檢查。
衍生類別向基類的自動類型轉換隻對指標或參考型別有效, 在2個對象之間不存在這樣的轉換。
函數模板和類模板成員函數的定義通常放在標頭檔中。
預設情況下,對於一個執行個體化了的類模板,其成員只有在使用時才被執行個體化。
c++ primer 5