为什么不允许构造函数被跳过

Damn_boy 2010-11-10 07:57:20

class test
{
public:
int testVal;
test();
}

int main()
{
switch(1)
{
case 1:
test a;
break;
case 2:
test b;
break;
}
}


编译器提示 构造函数被跳过。
为嘛不允许被跳过?
...全文
127 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddboy 2010-11-11
  • 打赏
  • 举报
回复
主要问题,应该还是作用域名问题,在C++里,其实即使一段没特殊意义的东西,都是可以用{}括起来表示一个作用域名,像你在switch里初始化,在后面是无法检测有没有这个对象的,所以本身应该用{}括起来表示特定的域,至于里面的指针应该没影响的,其实只是用test a;对象只是被定义了,并不是真正的实例化,应该是这样理解吧
wen_eric 2010-11-11
  • 打赏
  • 举报
回复
因为这个声明的构造函数吧系统默认调用的构造函数给同名隐藏掉了。在类声明中,你只给出了构造函数的声明,却没有给出定义。所以不能进行构造。跳出程序了
arong1234 2010-11-11
  • 打赏
  • 举报
回复
一个对象的构造函数如果可以被跳过,那么如果这个对象需要被释放时,系统怎么知道是不是需要析构它?
假如对你的类做个简短的修改如下,如果构造被跳过,那么析构被调用就导致错误。


class test
{
public:
char* p;
test(){p=new char;}
~test(){delete p;}
}


HonryZZ 2010-11-10
  • 打赏
  • 举报
回复
作用域的问题.
jikeyuan1 2010-11-10
  • 打赏
  • 举报
回复
test(){}
LZ好像定义就错了吧
zjs100901 2010-11-10
  • 打赏
  • 举报
回复
试想一下如果编译器不提示错误,该程序的输出会是0吗?


class test
{
public:
int testVal;
test()
{
testVal = 0;
}
};

int main()
{
switch(2)
{
case 1:
test a;
break;
case 2:
test b;
b.testVal = a.testVal;
printf( "%d", b.testVal );
break;
}
return 0;
}
正是由于无法调用 a 的构造函数,编译器只好给出一个错误提示了。
xzjxylophone 2010-11-10
  • 打赏
  • 举报
回复
根据 4楼的解释
我是这样理解的:
int main()
{
int i=1;
switch(i)
{
case 1:
test a;
break;
case 2:
test b;
break;
default:
break;
}

return 0;
}
红色的那一块是属于同一个作用域
因此,如果你在 case 2 下面如果有代码调用a的话例如:
case 2:
test b;
a.testVal = 4;
break;

这样也是正确的, case1 和case2 属于同一个作用域, 所以就会产生不可预测的错误:
按4楼的说法就是,每个case 语句块都加个 {}, 那么 几个case 块 就在不同的作用域了。

zongzihe 2010-11-10
  • 打赏
  • 举报
回复


class test
{
public:
int testVal;
test() {}
};

int main()
{
switch(1)
{
case 1:
{
test a;
break;
}
case 2:
{
test b;
break;
}
}
return 0;
}
zongzihe 2010-11-10
  • 打赏
  • 举报
回复

class test
{
public:
int testVal;
test() {}
};

int main()
{
switch(1)
{
case 1:
{
test a;
break;
}
case 2:
{
test b;
break;
}
}
return 0;
}
//理由上面几位已经说了
zjs100901 2010-11-10
  • 打赏
  • 举报
回复
楼主的test类很简单,所以跳过并不会有多大影响,但如果test类里比较复杂就不该跳过了。
其实编译器的意思是说,当switch语句里面的整数是2时,如果在case 2:里面访问对象a,这个时候,能够访问a类的成员函数(假设定义了的话),但是a的构造函数没有执行,也就是警告里说的“跳过”,这时候就麻烦了,可能构造函数里要初始化成员变量(假设定义了的话),但没有初始化,而成员函数马上就使用,那就会出问题。
解决的方法是限制a的可以访问它的范围:
switch(1)
{
case 1:
{
test a;
break;
}
case 2:
{
test b;
break;
}
}
你可能会说你在switch里面填的是1,不可能直接跳到case 2:去,但编译器不是神,要不然为什么总是输出一些文不对题的警告或错误呢?
Csuxiaowu 2010-11-10
  • 打赏
  • 举报
回复
test(){};
case 1:{
test a;
break;}

qq120848369 2010-11-10
  • 打赏
  • 举报
回复
class test
{
public:
int testVal;
test();
};

int main()
{
int i=1;
switch(i)
{
case 1:
test a;
break;
case 2:
test b;
break;
default:
break;
}
return 0;
}
1>d:\my documents\visual studio 2010\projects\bbb\bbb\ccc.cpp(16): error C2360: “a”的初始化操作由“case”标签跳过
1> d:\my documents\visual studio 2010\projects\bbb\bbb\ccc.cpp(14) : 参见“a”的声明
1>d:\my documents\visual studio 2010\projects\bbb\bbb\ccc.cpp(19): error C2361: “default”标签跳过“b”的初始化操作
1> d:\my documents\visual studio 2010\projects\bbb\bbb\ccc.cpp(17) : 参见“b”的声明
1>d:\my documents\visual studio 2010\projects\bbb\bbb\ccc.cpp(19): error C2361: “default”标签跳过“a”的初始化操作
1> d:\my documents\visual studio 2010\projects\bbb\bbb\ccc.cpp(14) : 参见“a”的声明


就因为test没有构造函数吧
liutengfeigo 2010-11-10
  • 打赏
  • 举报
回复
class test
{
public:
int testVal;
test(){}
};

64,661

社区成员

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

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