天天看点

【No.7 C++对象的构造与析构时间】

==【注意】== 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度

本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。

贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用

【No.7  C++对象的构造与析构时间】

由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,此贴仅供交流讨论本次问题,若大家对上一问题有任何疑问,请通过解答末尾的传送链接前往该问题贴回复讨论

[问题No.7]

请写出以下代码的执行结果

复制内容到剪贴板

<code>#include&lt;iostream&gt; using namespace std; //------------------------------------------------- class Foo {   public:     Foo(void)     {       cout&lt;&lt;"constructing..."&lt;&lt;endl;       ++_counter;     }     Foo(const Foo &amp;p)     {       cout&lt;&lt;"copy constructor..."&lt;&lt;endl;       ++_counter;     }     ~Foo(void){ cout&lt;&lt;"destructing..."&lt;&lt;endl; }      public:     static int _counter; }; int Foo::_counter = 0; //--------------------------------------------- Foo global; Foo Trap(Foo foo) {   Foo local = foo;   Foo *heap = new Foo(global);   *heap = local;   Foo pa[4] = { local, *heap };   return *heap; } int main(int argc, char **argv) {   Foo p;   Trap(p);   cout&lt;&lt;Foo::_counter&lt;&lt;endl;   return EXIT_SUCCESS; }</code>

输出结果

问题浅析

本题出错,大多是由于初学者自己主观臆断switch-case块的执行方式,此题中,i == 1,有的午饭就主观地认为case 1:分支被执行,x = 5,然后输出为5.但是,switch-case语句的陷阱就在这里,case分支不是if-else这样的非此即彼的判断语句,case只是一个入口,i == 1时,找到入口case 1:,因此执行这个入口之后的所有语句,直到swtich语句块结束。

那么如何杜绝此问题的发生呢?见如下代码

<code>swtich(i) {   case 1: x = 5; break;   case 2: ++x; break;   case 3: ++x; break;   default: break; }</code>

只要执行了一条分支语句就break出switch语句块,这样就实现了我们之前臆断的程序功能,并且,如果不是有意要执行多个case分支,请时刻记住,每一个case分支(包括default)后都应该填上break语句,并且不管你有没有必要写default分支,也请写上,并break,这样做是是程序的可读性得到保障, 以免别的程序员误以为你忘记了default情况的处理。

     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733265,如需转载请自行联系原作者

继续阅读