effective35 基礎議題

2021-10-24 12:02:12 字數 2805 閱讀 5996

1.仔細區別pointers和references

2.最好使用c++轉型操作符

3.絕對不要以多台方式處理陣列

4.非必要補提供default construnctors

指標:這玩意相信大家都不陌生了.(萬惡之源).

引用:這是我在學了c++之後新接觸的東西,乍看很高階,其實底層的實現也就是乙個指標.(vs2013底層彙編是以常指標的形式實現的)

在c++中,引用又分為左值引用和右值引用.這些都是後話

相關筆記:
1.引用相關注意點:

1.引用必須初始化

2.沒有所謂的空引用

3.引用在定義時,知識吧某個變數的位址和這個引用變數繫結到一起,而不是完全拷貝

4.不能定義引用的引用

5.引用智慧型繫結物件和變數,不能繫結字面值和計算結果.

6.引用不是物件,所以沒有實際的位址

引用和指標的區別
引用在定義時必須初始化,指標沒有要求

引用在初始化時引用乙個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何乙個同型別實體

沒有null引用,但有null指標

引用自加即引用的實體增加1,指標自加即指標向後偏移乙個型別的大小

有多級指標,但是沒有多級引用

訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理

引用比指標使用起來相對更安全

轉型操作符:

1.static_cast:

用於非多型型別的轉換(靜態轉換),編譯器隱式執行的任何型別轉換都可用static_cast,但它不能用於兩個不相關的型別進行轉換

只要不涉及繼承機制,一般的變數都可以使用這個

2.const_cast:

const_cast最常用的用途就是刪除變數的const屬性,方便賦值

3.dynamic_cast:

用於將乙個父類物件的指標/引用轉換為子類物件的指標或引用(動態轉換)

向上轉型:子類物件指標/引用->父類指標/引用(不需要轉換,賦值相容規則)

向下轉型:父類物件指標/引用- >子類指標/引用(用dynamic_cast轉型是安全的)

注意

dynamic_cast只能用於含有虛函式的類

dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0

4.reinterpret_cast

reinterpret_cast操作符通常為運算元的位模式提供較低層次的重新解釋,用於將一種型別轉換為另一種不同的型別

也就是說,我們可以使用reinterpret_cast來強迫了解我們的意圖

!!!但是,因為reinterpre_cast是直接操作位模式的,所以,在移植性上有很大的不便

#define static_cast (type,expr) ((type)(expr))

#define const_cast(type,expr) ((type)(expr))

#define reinterpret_cast (type,expr) ((type)(expr))

1.假設有乙個類bst(binary rearch tree),以及乙個繼承自bst的類balancebst;

2.現在考慮下面乙個函式,用來列印bsts陣列中的每乙個bst的內容:

void printbstarray(ostream& s, const bst array, int numelements)

}

如果將bst物件組成的陣列傳給此函式

bst bstarray[10];

printbstarray(cout,bstarray,10);

但是如果如果將balancebst物件組成的陣列交給這個函式

balancebst bbstarray[10];

printbstarray(cout,bbstarray,10);

會發成未知的行為。
因為第一bst物件和balancebst物件所佔記憶體大小是不一樣的,理論上派生類會比基類所佔的記憶體要大一點;第二array是乙個指標,array[i]相當於*(array+i),array和array+i在記憶體上相距多遠?答案是i*sizeof(bst),因為理論上bst陣列全是bst型別的物件。所以當派生類物件傳進去的時候,sizeof(bst)和sizeof(balancebst)在記憶體上不一定能對應,這個結果是不可預期的。

同理,如果嘗試通過乙個base class指標,刪除乙個有derived class objects組成的陣列,上述問題也會出現,這也是為什麼析構函式為虛函式的原因。

關於預設構造:

1.當沒有任何顯示建構函式時,編譯器會自動"贈送"我們乙個預設的建構函式;

當我們不提供預設建構函式時:

1.無法產生陣列;

class equipments ;

equipments bestpieces[10]; // error! 陣列的基本元素物件無法生成

equipments *bestpieces = new equipments[10] // error!同理

找到一篇較好的部落格,可以檢視這個

More Effective C 《基礎議題》

1 指標 指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元 而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如 int a 1 int p a int a 1 int b a 上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a...

《演算法基礎》 3 5 鍊錶演算法

到目前為止,本章描述了一些用於建立和維護鍊錶的演算法,包括在鍊錶的開頭 結尾和中間新增項的演算法,查詢鍊錶中項的演算法和從鍊錶中刪除項的演算法。以下各節描述了利用其他方式來操作鍊錶的演算法。3.5.1 複製鍊錶 一些演算法重新排列鍊錶。本節和下一節將描述一些對鍊錶中的項進行排序的演算法。如果想保持原...

零基礎學python 3 5 記憶體管理

變數無需事先宣告 變數無需指定型別 程式猿不用關係記憶體管理 變數名會被 del能夠直接釋放資源 1.python使用的是引用呼叫,而不是值呼叫,他使用的 演算法是引用計數演算法,我以下舉兩個樣例 x 4 y 4 alist 1,2,3 blist 1,2,3 print x is y print ...