我定义了一个名为String的类,我声明了一个String对象使用=赋值来初始化它,但是我对它背后的过程有一些疑问。让我们看看代码:
class String{
public:
String() :str(""){ cout << "default constructor" << endl; }
String(int n);
String(const char *p);
String(const String &x) :str(x.str)
{
cout << "copy constructor" << endl;
}
String& operator=(const String &x)
{
str = x.str;
cout << "operator =" << endl;
return *this;
}
string getStr() const
{
return str;
}
private:
string str;
};
ostream& operator<<(ostream &o,const String &x)
{
o << x.getStr();
return o;
}
String::String(int n)
{
stringstream ss;
ss << n;
ss >> str;
ss.clear();
ss.str("");
cout << "String(int n)" << endl;
}
String::String(const char *p)
{
str = *p;
}
int _tmain(int argc, _TCHAR* argv[])
{
String s6;
s6 = 10;
cout << s6 << endl;
return 0;
}
结果如下图所示:
好吧,这个好理解,先调用默认构造函数,再调用String::String(int n)构造函数,最后调用复制赋值。 然后我像这样修改主函数:
int _tmain(int argc, _TCHAR* argv[])
{
String s6=10;
cout << s6 << endl;
return 0;
}
我不明白为什么它不调用复制赋值,在这种情况下它背后的过程是什么?
最佳答案
你混淆了赋值和初始化。
String s6=10;
不是赋值,而是初始化;更准确地说,copy intialization .
1) when a named variable (automatic, static, or thread-local) of a non-reference type
T
is declared with the initializer consisting of an equals sign followed by an expression.
所以 s6
是由适当的构造函数初始化/构造的,即 String::String(int)
,这里没有赋值。
关于C++声明自定义类对象使用=赋值初始化的过程是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886117/