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只能用於含有虛函式的類4.reinterpret_castdynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
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 ...