C++ C++;什么';当使用=赋值来初始化用户定义的类对象时,是什么过程?
我定义了一个名为String的类,并使用=assignment声明了一个String对象来初始化它,但我对它背后的过程有一些疑问。让我们看看代码:C++ C++;什么';当使用=赋值来初始化用户定义的类对象时,是什么过程?,c++,constructor,initialization,variable-assignment,assignment-operator,C++,Constructor,Initialization,Variable Assignment,Assignment Operator,我定义了一个名为String的类,并使用=assignment声明了一个String对象来初始化它,但我对它背后的过程有一些疑问。让我们看看代码: class String{ public: String() :str(""){ cout << "default constructor" << endl; } String(int n); String(const char *p); String(const String &x)
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():str(“”{cout您混淆了赋值和初始化
字符串s6=10;
不是赋值,而是初始化;更准确地说
1) 当使用由等号后跟表达式组成的初始值设定项声明非引用类型T
的命名变量(自动、静态或线程本地)时
因此,s6
由适当的构造函数初始化/构造,即String::String(int)
,这里没有赋值。这不是赋值,这是
T object=other;
(1)
如果T
是类类型,并且other
类型的cv非限定版本不是T
或派生自T
,或者如果T
是非类类型,但other
类型是类类型,则用户定义的转换序列可以从类型转换为f检查T
(或从T
派生的类型,如果T
是类类型且有转换函数可用),并通过重载解析选择最佳值。转换的结果,这是一个prvalue临时表达式(在C++17之前)prvalue表达式(从C++17开始)如果使用了转换构造函数,则用于直接初始化对象。
在您的情况下,T object=other
转换为T object(T(other))
()
最后一步通常经过优化,转换结果直接在分配给目标对象的内存中构造,但即使未使用,也需要相应的构造函数(移动或复制)可访问。(直到C++17)
选择的最后几个词解释了为什么在直接初始化期间没有调用复制构造函数。您的代码(如发布的)无法编译。请发布一个
int _tmain(int argc, _TCHAR* argv[])
{
String s6=10;
cout << s6 << endl;
return 0;
}