C++零散知識點

來源:互聯網
上載者:User

1. 今天寫程式,寫了這樣一行代碼:char * pArr[10] = new char[20]; 後來發現這樣寫是不對的。= 號左邊是char** 類型的,右邊是char*類型的,不可以賦值的。也不可以這樣寫: char * pArr[10]={new char[20]}; 這樣只是對數組裡的第一個元素裡的指標初始化了記憶體地區,其他9個元素沒有被分配記憶體。這裡可以在花括弧裡寫10個“new char[20]"並用逗號分隔。還可以用for迴圈給數組的10個元素分別初始化。其實不考慮記憶體的浪費,這裡一開始聲明一個二維數組就可以啦:char
Arr[10][20];

2. 將const關鍵字用於指標有兩種方法,一種是讓指標指向一個常量對象,如 int age=3; const int * p=&age;或者 int const * p=&age; 這種情況下,不可以通過指標修改指向的age的值,因為指標指向的是一個int型的常量,但是允許將指標指向另一個位置。另一種是將指標本身聲明為常量,如 int age =3; int * const p=&age; 這種情況下,指標只能指向age,即指標指向的地址不可以被改變了,但是可以通過指標修改age的值。

3. const 和引用參數。先明確兩個概念:左值參數是可被引用的對象,例如,變數、數組元素、結構成員、引用和被解除引用的值。非左值參數包括字面常量和包含多項的運算式。假設有這樣一個函數,double refcube(double &ra); 當程式試圖使用像refcube(x+3.0)這樣的函數調用的時候,編譯器將會發出警告,因為運算式x+3.0並不是變數。如果當初這樣聲明函數 double refcube(const double &ra),則c++允許refcube(x+3.0)這樣調用函數,這時產生了臨時變數,並將其初始化為運算式x+3.0的值,這是c++的一種新的限制。當引用參數是const時,c++將在下面兩種情況下產生臨時變數:a)實參的類型正確,但不是左值;
b)實參的類型不正確,但可以轉換為正確的類型。臨時變數只在函數調用期間存在。那為什麼只有加了const才允許建立臨時變數呢,因為在不加const的情況下,如果接受引用參數的函數的意圖是修改作為參數傳遞的變數,則建立臨時變數將阻止這種意圖的實現,解決方案是禁止建立臨時變數。如果refcube()函數的目的只是使用傳遞的值而不是修改它們,那麼建立臨時變數不會造成任何不利的影響,反而會使函數在可處理的參數種類方面更通用。

4. strcpy_s() 是一個比strcpy()安全的函數,這裡說下我編程中遇到的問題。當時我在運行有下面這樣一個建構函式的程式時,出現了崩潰,原因就是第二個參數給的值是錯誤的,應該改為strlen(s)+1(style是char * 的指標):

HasDma(const char * s){ style = new char[std::strlen(s) + 1]; strcpy_s(style, std::strlen(s), s);}

看下它的三個參數的版本的原型:

errno_t strcpy_s(   char *strDestination,   size_t numberOfElements,   const char *strSource );

注意,這裡的numberOfElements,指的的是buffer的大小。

 5. 記憶體對齊的唯一原則:資料必須放在這樣記憶體位址,其記憶體位址為類型大小的整數倍。對於:

struct TEST {int a;char b:1;char c:2;int d;}ts;

sizeof(ts) = 12。但是這裡注意,b和c實際上是佔用了一個位元組。關於位域的內容參考《C語言中的關於“位域”的說明》這篇部落格。

6. 虛函數實現了晚綁定, 析構是從最外層(晚派生)向最裡層(早派生)進行析構,如果解構函式裡使用虛機制,則有可能綁定到一個比當前需要析構的派生層次更晚派生的一個層次的方法上,而這一層次,已經被析構掉了,這就會出現異常。所以C++編譯器忽略解構函式中使用的虛機制。意思是:即使你在解構函式中調用了其他的虛函數,也僅僅是執行本類中的行為,不會綁定到其他類中,也就是說,忽略了虛機制。

7. 比較好的求一般數組元素個數的方法是:

sizeof(arr)/sizeof(arr[0]);

8. 當把數組作為一個參數傳入時,怎麼方便的知道數組大小呢?

一個也把數組的大小作為參數傳入,還有一種方法就是在數組的最後一個元素設一個特殊值,這樣在函數內部就可以通過這個特殊值來判定有沒有達到數組的末尾。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.