c++基礎雜記

1.左值與右值

左值:L-value中的L指的是Location,表示可尋址。左值可以表示對象,即具有對應的可以由用戶訪問的存儲單元。左值表示存儲在計算機內存的對象,即“可尋址值”。也就是可以用&來取地址的對象是左值。

右值:R-value中的R指的是Read,表示可讀。指的是引用了一個存儲在某個內存地址裏的“數據”。

所以左值又可以歸納爲:左值表示程序中必須有一個特定的名字引用到這個值。而右值引用的是地址裏的內容,所以相反右值又可以歸納爲:右值表示程序中沒有一個特定的名字引用到這個值除了用地址

2.NULL和nullptr

c++11之前只有NULL來表示指針爲空 也就是‘0’,c++11加了nullptr來表示空指針。(從理解上表述)兩者的不同在於NULL的類型是int,nullptr的類型是指針,恰好空指針的值是‘0’和NULL相等,所以兩者看上去很像。但是值相同類型不同這是區分二者的關鍵。例如http://www.cnblogs.com/feng-sc/p/5710724.html 文章1.2節

 


 
class Test { public: void TestWork(int index) { std::cout << "TestWork 1" << std::endl; } void TestWork(int * index) { std::cout << "TestWork 2" << std::endl; } }; int main() { Test test; test.TestWork(NULL); test.TestWork(nullptr); }

 

 

 


 

運行記過結果分別是TestWork 1,TestWork 2。

3.dll和exe中如果存在相同的全局變量也不會衝突,因爲dll中的全局變量已經變成了地址,不存在變量名稱了,重命名只在編譯鏈接階段能檢測出來。

4std:string 調用find()函數如果查找的是漢字,尤其是比較短的時候很容易出錯,因爲漢語在ansi的編碼中佔兩個字節,兩個漢字的後一個字節的編碼和另一個漢字前一個字節的編碼可能正好是要查找的那個漢字對應的編碼,所以遇到漢字的查找操作最好用std:wstring

5兩個string中如果前面的字符完全一樣,另一個string後面還有若干個0,此時調試的時候,看不出這兩個string的顯示有什麼不同,但是用compare比較的時候是不相同的,調試的時候容易懵逼。

6c++和c的函數參數都是從右向左入棧,但是對於參數的計算順序確實未定義,比如   int i=8; int j=8; void rest( i+j,++j);  

這個函數從右向左入棧是沒錯的 但是入棧之前會計算兩個參數的值,這時這兩個參數的計算順序卻是未知的,

發佈了21 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章