来自Effective c++ 上的一个小程序,编译无错但是运行就有问题

wlnju 2012-06-14 05:30:06
来自13节,关于初始化顺序

class Wacko {
public:
Wacko(const char *s): s1(s), s2(0) {}
Wacko(const Wacko& rhs): s2(rhs.s1), s1(0) {}
private:
string s1, s2;
};
Wacko w1 = "Hello world!";
Wacko w2 = w1;

这个程序理论上的结果是不是
w1:s1="hello world", s2=0
w2:s1=0,s2="hello world"

我运行这个程序就出错,不知道为啥,
出错信息:
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
请高人指点下这个程序以及内部潜在的问题,谢谢。!
...全文
176 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fsy351 2012-06-14
  • 打赏
  • 举报
回复
如果没记错的话就是这样的,你自己实现一下就知道了
fsy351 2012-06-14
  • 打赏
  • 举报
回复
这个初始化列表的问题要分情况讨论的
如果是继承类,要先出始化基类成员,在按初始化列表的顺序初始化数据,
如果不是集成类,那么按照变量定义的顺序初始化变量,出始化列表顺序无意义
Binzo 2012-06-14
  • 打赏
  • 举报
回复
类Class A{
int a;
int b;
};

构造函数A():b(0),a (0);
{
}

调用构造函数时不是先b = 0;而是先a = 0,再b = 0。
wlnju 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

s2(0)这个0表示什么意思?
[/Quote]

嘿。。。谢谢大师。。去掉后就正常了,我太菜了。。。还有,请您可否解释下:
初始化列表中成员列出的顺序和它们在类中声明的顺序相同
这个是啥意思?
www_adintr_com 2012-06-14
  • 打赏
  • 举报
回复
0 会被当做一个指针, 用空指针来初始化 string 会出错. 把它去掉就好了:
Wacko(const char *s): s1(s), s2() {}
Wacko(const Wacko& rhs): s2(rhs.s1), s1() {}
昵称很不好取 2012-06-14
  • 打赏
  • 举报
回复
s2(0)这个0表示什么意思?

64,282

社区成员

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

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