关于C++编程思想151页遇到的内存分配问题

书上例子如下:

1、

//: C06:Nojump.cpp // From Thinking in C++, 2nd Edition // Available at http://www.BruceEckel.com // (c) Bruce Eckel 2000 // Copyright notice in Copyright.txt // Can't jump past constructors class X { public: X(); }; X::X() {} void f(int i) { if(i < 10) { // goto jump1; // Error: goto bypasses init } X x1; // Constructor called here jump1: switch(i) { case 1 : X x2; // Constructor called here break; // case 2 : // Error: case bypasses init X x3; // Constructor called here break; } } int main() { f(9); f(11); }///:~  

在编译时,将图中两行注释起来编译,是正确的,当去掉goto的注释后,会得到如下报错

即,跳过了x1的初始化,注释掉x1的初始化语句后通过

问题出现在将第二个case的注释打开之后,得到如下错误:

 

从提示上看是一个问题

2、

神奇的地方,在于,注释掉x2的初始化语句或者case2时,能编译通过

switch(i) { case 1 : // X x2; // Constructor called here break; case 2 : // Error: case bypasses init X x3; // Constructor called here break; } 

3、正确的

然后,我们修改代码如下:

void f(int i) { if(i < 10) { goto jump1; // Error: goto bypasses init } // X x1; // Constructor called here jump1: switch(i) { case 1 : { X x2; // Constructor called here break; } case 2 : // Error: case bypasses init { X x3; // Constructor called here break; } } } 

通过编译,搞定

 

 

总结:主要问题在于:

1、编译器会检查有没有把对象定义放在一个条件块中,比如switch和goto,第一个是goto或者switch跳过了x1的定义

2、对于switch。在switch语句内定义一个变量的时候,如果不在一个语句块内,它作用域是直到遇到switch的"}"才结束的,而case语句则可能跳过定义它的整个作用域。

所以,在这里,定义加上括号,让它在case的}处作用域结束即可

http://hi.baidu.com/ati_crossfire/blog/item/e2bb6b10023119d6a6ef3f32.html

 

留存备份

你可能感兴趣的:(编程,C++,c,Constructor,编译器)