==【注意】==程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度
【No.7 C++对象的构造与析构时间】
由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性, 此贴仅供交流讨论本次问题,若大家对上一问题有任何疑问,请通过解答末尾的传送链接前往该问题贴回复讨论
[问题No.7]请写出以下代码的执行结果
复制内容到剪贴板
代码:
#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;//---------------------------------------------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<<Foo::_counter<<endl; return EXIT_SUCCESS;}
浅析
输出结果0 问题浅析本题出错,大多是由于初学者自己主观臆断switch-case块的执行方式,此题中,i == 1,有的午饭就主观地认为case 1:分支被执行,x = 5,然后输出为5.但是,switch-case语句的陷阱就在这里,case分支不是if-else这样的非此即彼的判断语句,case只是一个入口,i == 1时,找到入口case 1:,因此执行这个入口之后的所有语句,直到swtich语句块结束。那么如何杜绝此问题的发生呢?见如下代码
复制内容到剪贴板
只要执行了一条分支语句就break出switch语句块,这样就实现了我们之前臆断的程序功能,并且,如果不是有意要执行多个case分支,请时刻记住,每一个case分支(包括default)后都应该填上break语句,并且不管你有没有必要写default分支,也请写上,并break,这样做是是程序的可读性得到保障, 以免别的程序员误以为你忘记了default情况的处理。 代码:
swtich(i){ case 1: x = 5; break; case 2: ++x; break; case 3: ++x; break; default: break;}