天天看點

【No.10 C++類成員的初始化順序】

==【注意】== 程式語言隻是我們與計算機交流并讓計算機實作我們創造性思想的工具,可以并鼓勵深入掌握一門語言,但千萬别沉迷于鑽某種語言的牛角尖,一定要把握好二者間的度

本帖屬不定時連載貼,以試卷的形式提出一個比較基礎的問題供大家思考讨論,問題的解析将在下一更新貼中一并給出,這樣做是希望還不清楚問題的朋友有自己思考和讨論的時間,希望大家能從這些文章中有所收獲。

貼中問題屬我在學習C\C++過程中遇到的一些文法或者比較隐晦的程式問題,其中有自己的總結,也不乏網絡上搜尋到的經典解析,在此分享給大家,希望能起到抛磚引玉的作用

【No.10 C++類成員的初始化順序】

由于連載形式,每帖第二部分都配有上一問題的解答。為了保持文章的針對性和一緻性,

[問題10]

請寫出以下代碼的執行結果,并說明原因:

複制内容到剪貼闆

<code>#include&lt;iostream&gt; using namespace std; class Test {   public:     Test(void):_j(0), _i(0){}     Test(int k):_j(k), _i(_j){}     void print(void)     {       cout&lt;&lt;"i = "&lt;&lt;_i&lt;&lt;endl              &lt;&lt;"j = "&lt;&lt;_j&lt;&lt;endl;     }   private:     int _i;     int _j; }; int main(int argc, char **argv) {   Test t(20);   t.print();   return EXIT_SUCCESS; }</code>

問題淺析

<code>#include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; //AllocationMem函數中,第一個形參類型為char * //當main函數中調用AllocationMem函數時 //實參是p指針,此時形參ptr是對p指針值 //的一份拷貝,即ptr = NULL,但是由于ptr指針是 //一個局部于AllocationMem函數的新的指針,而 //非實參p指針本身,是以,在AllocationMem函 //數中使ptr指針指向了一塊大小為sizeof(char *) * size的 //記憶體空間,然後AllocationMem函數結束,ptr指針 //被銷毀,那塊記憶體也就沒有被任何指針所指向,是以存在 //記憶體洩露,洩漏大小為sizeof(char *) * size void AllocateMem(char *ptr, int size) {   ptr = (char *)malloc(sizeof(char *) * size); } void main(void) {   char *p = NULL;   AllocateMem(p,5);  //此處看似為指針p配置設定了5個位元組大小                                //的空間,實際上p仍然為NULL   strcpy(p,"1234");  //由于p指針是NULL,是以strcpy失敗,程式異常終止   printf("%s\n",p); }</code>

     本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/733274,如需轉載請自行聯系原作者

繼續閱讀