我自定义了一个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=10;
cout << s6 << endl;
return 0;
}
此时结果如图所示,为什么只调用了String::String(int n)构造函数,不是应该还执行String& operator=(const String &x)吗?
我把初始化过程分两步:
String s6;
s6=10;
这样运行的结果如下:
先调用默认构造函数,再调用String::String(int n)构造函数,最后调用String& operator=(const String&x),这个就很能理解了,可是为什么之前只调用了String::String(int n)构造函数?之前那样写,究竟是怎么执行的呢?