SLet采取这个课程:
class standardClass
{
public:
standardClass(int) {}
~standardClass() {}
standardClass(standardClass&) {}
standardClass & operator=(standardClass&)
{
return *this;
}
};
int main()
{
standardClass stdClassObj1(1);
standardClass stdClassObj2(stdClassObj1);
standardClass stdClassObj3 = stdClassObj2;
stdClassObj1 = stdClassObj2;
stdClassObj2 = standardClass(4);
stdClassObj2 = 4;
}
我在最后一次作业时遇到错误。
除了最后一行之外,所有这些行都是允许的。在最后一个中,整数4不会调用构造函数。该错误表明没有赋值操作符。我明白那个。但令我感到困惑的是,为什么这种隐式转换适用于新对象(第1行)而不适用于现有对象(第2行)。
我明白在第1行的情况下,调用复制构造函数来创建新的AObj4。但是在第2行它会调用assingment运算符。为什么它不能使用整数4创建一个临时对象并调用赋值运算符,就像它对第3行一样?
答案 0 :(得分:3)
standardClass(standardClass &objToCopy) // copy constructor
复制构造函数应该使用const
- 限定引用,如下所示:
standardClass(const standardClass &objToCopy)
您的赋值运算符相同:应该是
standardClass & operator=(const standardClass &objToCopy)
非const
- 限定左值引用不能与临时对象一起使用,例如临时对象,否则将从文字4
创建。
答案 1 :(得分:1)
你刚改变了整个班级。问题是你有:
standardClass & operator=(standardClass &objToCopy) // assignment operator
{
cout << "Copy assignment operator: " << objID << endl;
objID = objToCopy.objID;
return *this;
}
4
无法转换为standardClass &
。
如果您使用:
standardClass & operator=(standardClass const& objToCopy)
// ^^^^^^
{
cout << "Copy assignment operator: " << objID << endl;
objID = objToCopy.objID;
return *this;
}
一切都会好的。