gpt4 book ai didi

C++声明自定义类对象使用=赋值初始化的过程是怎样的?

转载 作者:太空狗 更新时间:2023-10-29 20:21:31 25 4
gpt4 key购买 nike

我定义了一个名为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;
}

结果如下图所示:

result1

好吧,这个好理解,先调用默认构造函数,再调用String::String(int n)构造函数,最后调用复制赋值。然后我像这样修改主函数:

int _tmain(int argc, _TCHAR* argv[])
{
String s6=10;
cout << s6 << endl;
return 0;
}

结果如下图: result2

我不明白为什么它不调用复制赋值,在这种情况下它背后的过程是什么?

最佳答案

你混淆了赋值和初始化。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com