==【注意】== 程式語言隻是我們與計算機交流并讓計算機實作我們創造性思想的工具,可以并鼓勵深入掌握一門語言,但千萬别沉迷于鑽某種語言的牛角尖,一定要把握好二者間的度
本帖屬不定時連載貼,以試卷的形式提出一個比較基礎的問題供大家思考讨論,問題的解析将在下一更新貼中一并給出,這樣做是希望還不清楚問題的朋友有自己思考和讨論的時間,希望大家能從這些文章中有所收獲。
貼中問題屬我在學習C\C++過程中遇到的一些文法或者比較隐晦的程式問題,其中有自己的總結,也不乏網絡上搜尋到的經典解析,在此分享給大家,希望能起到抛磚引玉的作用
【No.8 常量指針與指針常量】
由于連載形式,每帖第二部分都配有上一問題的解答。為了保持文章的針對性和一緻性,此貼僅供交流讨論本次問題,若大家對上一問題有任何疑問,請通過解答末尾的傳送連結前往該問題貼回複讨論
[問題No.8]
請寫出以下代碼中每一行指派語句的執行結果,如有編譯錯誤的,請寫明錯誤原因
複制内容到剪貼闆
<code>#include<iostream> int main(int argc, char **argv) { const char *str1 = "abc"; char * const str2 = "abc"; str1[1] = 'B'; *str1[1] = 'B'; *str1 = "ABC"; str1 = "ABC"; str2[1] = 'B'; *str2[1] = 'B'; *str2 = "ABC"; str2 = "ABC"; return EXIT_SUCCESS; }</code>
輸出結果
問題淺析
<code>#include<iostream> using namespace std; //------------------------------------------------- class Foo { public: Foo(void) { cout<<"constructing..."<<endl; ++_counter; } Foo(const Foo &p) { cout<<"copy constructor..."<<endl; ++_counter; } ~Foo(void){ cout<<"destructing..."<<endl; } public: static int _counter; }; int Foo::_counter = 0; //--------------------------------------------- //注:帶圈數字表示結果中的第n行 Foo global; //①全局變量會自動初始化,調用一次構造函數 //顯示constructing... // _count == 1 Foo Trap(Foo foo) //③函數形參是值傳遞,是以需要複制對象,調用一次複制構造函數 //顯示copy constructor... // _count == 3 { Foo local = foo; //④構造local對象時,使用的是複制初始化,調用複制構造函數 //顯示copy constructor... // _count == 4 Foo *heap = new Foo(global); //⑤通過直接複制方式在堆上new了一個匿名Foo對象 //并用heap指針指向該匿名對象 //顯示copy constructor... // _count == 5 *heap = local; //這裡調用的是Foo類的預設指派操作符Foo& operator =(const Foo&) //由于并沒有建立任何對象,是以這裡不會調用構造函數 Foo pa[4] = { local, *heap }; //開辟了一個大小為4的Foo對象數組 //⑥、⑦通過複制初始化用local、*heap對象初始化 //pa[0]、pa[1] //顯示copy cunstructing... // copy cunstructing... //⑧、⑨剩下的兩個元素使用預設構造函數進行初始化 //顯示constructing... // constructing... // _count == 9 return *heap; //⑩函數的傳回類型為Foo對象的值,是以傳回時将調用Foo類的 //複制構造函數,用*heap指向的對象,構造一個新的匿名對象用作傳回 //顯示copy cunstructing.... // _count == 10 } //第(11)(12)(13)(14)(15)(16)行 //函數傳回,所有在函數中的局部Foo對象的生命周期已經到達尾聲 //這些對象是:形參foo、局部變量local、局部數組中的四個元素 //顯示destructing... // destructing... // destructing... // destructing... // destructing... // destructing... int main(int argc, char **argv) { Foo p; //②建立一個對象,調用預設構造函數,顯示constructing... // _count == 2 Trap(p); //(17)函數的傳回值是一個匿名對象,此對象在函數傳回後消亡 //顯示destructing... cout<<Foo::_counter<<endl; //⑩⑧輸出對象的個數10 return EXIT_SUCCESS; }//(19)、(20)main函數傳回,程式結束,釋放堆上的空間、釋放全局變量空間 //由于函數Trap在堆上建立了一個Foo對象,此時釋放 //顯示destructing... // destructing...</code>
本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/733267,如需轉載請自行聯系原作者