[英]c++ initialize other class in constructor
好的,所以我无法理解 C++ 构造函数:
如果我使用初始化列表方法,则代码有效:
Client::Client() : id(), name(){
// this works!
}
但常规方法不会:
Client::Client(){
id = String();
name = String();
// does not work
}
String 只是我写的另一个类; String 默认构造函数如下:
String::String(){
str = NULL;
}
Afaik,初始化列表允许您初始化常量和引用,但我真的不明白它在这里有什么帮助?
我错过了什么?
编辑:声明:
class String {
char *str;
public:
String();
String & operator =(const String &rhs);
}
class Client {
String id, name;
public:
Client();
};
字符串确实有一个赋值运算符,但我想用它来将“str”的内容复制到 lhs 字符串中,这可能是问题吗? 因为它尝试使用我的赋值运算符并失败?
解决了:
好吧,确实是赋值运算符,看来如果我给它一个str = NULL的String,它就无法strcpy并停止程序。 抱歉不准确,当我尝试初始化字符串变量时,我确实尝试调试并发现它在客户端的构造函数中失败,因为之后还有更多代码。 所以我明白第一种初始化方法是有效的,因为它直接不使用赋值运算符。
String & String::operator =(const String &rhs){
/*if(!rhs.str){ return *this; }*/ // had to add this line!
str = new char[strlen(rhs.str)];
strcpy(str, rhs.str);
return *this;
}
谢谢你们一堆。
先谢谢你,迈克尔。
它无法 strcpy 并停止程序
嗯,这是你的错误。 在id = String();
您使用带有空str
成员作为参数的String
调用复制赋值。 您的复制赋值运算符显然试图从具有未定义行为的空指针进行strcpy
。
我能给你的最好建议是“使用std::string
”。
所以我知道第一种初始化方法有效,因为它直接不使用赋值运算符,对吗?
正确的。 两个版本都默认首先构造成员,但第二个版本也进行复制分配。 如果默认初始化就足够了,您根本不需要为Client
提供用户定义的构造函数。
这两个构造函数实现之间的区别在于,前者显式地默认构造元素,而第二个则隐式地这样做,然后在默认构造的实例上调用赋值运算符。
Client::Client() : id(), name(){
}
Client::Client(){
id = String();
name = String();
}
如果您的赋值运算符坏了,那么第一个版本将起作用,而第二个则不起作用。
你应该总是更喜欢在初始化列表中初始化而不是在构造函数体中这样做,因为后者会导致不必要的构造,然后是赋值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.