c++中有关空间分配的一个小问题,看c++编程思想时有些没看明白.

021850524 2004-01-03 11:56:13
c++编程思想中的那个4.3.2节没有看懂.说的是空间分配,它说编译器甚至会检查我们有没有把一个对象的定义放到一个条件块中,比如在switch块中声明,或可能被goto跳过的地方.它给出的例子是:
//解除注释的句子会导致一个警告或一个错误.
//: 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);
}///:~
这个例子到底说明了什么问题,我看了之后感觉很模糊.能不能说得再详细一些?谢谢.
...全文
60 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jinhao 2004-01-27
  • 打赏
  • 举报
回复
if(i)
{
int p;
}
else
{
p=1; //错了,因为p在此处无定义
}
改正
if(i)
{
int p;
p=2
}
else
{
int p;
p=1; //注意,这个p不是上面那个p
}
可以这样,两个{}里用同一个p
int p;
if(i)
{
p=2;
}
else
{
p=1; //注意,这个p不是上面那个p
}

021850524 2004-01-27
  • 打赏
  • 举报
回复
就是说不能那么做了是吗?
021850524 2004-01-03
  • 打赏
  • 举报
回复
那如果是被if语句分开的呢?
比如说
if(i)
{
//定义一个对象A
}
else
{
//定义另外一个对象B
}
那这样能不能算得上是跳过了其中的一个对象.编译器也分配了内存,但是有一个对象没
被初始化?
这个在vc下通过了呀.
Jinhao 2004-01-03
  • 打赏
  • 举报
回复
你能保证x1,x2,x3被构造吗??如果不能,就说明编译器提出错误是正确的
编译器不知道会不会操作x1,但至少没有保证x1被构造,从语意上看,x1的构造取决于i,但i又是在运行时才会被确定。
这个例子说明的问题就是,给出了被构造的对象,必须保证在编译时就能确定它的存在
Jinhao 2004-01-03
  • 打赏
  • 举报
回复
No
对象是定义在{ }域中,出了域就没有了

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧