Implicity构造函数调用

时间:2014-12-11 08:19:02

标签: c++ constructor copy-constructor assignment-operator

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行一样?

2 个答案:

答案 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; 
    } 

一切都会好的。