隐式构造函数调用

Implicity constructor call

本文关键字:函数调用      更新时间:2023-10-16

SLet's take this class:

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 行中,它调用了断言运算符。为什么它不能像对第 3 行那样创建一个整数为 4 的临时对象并调用赋值运算符?

standardClass(standardClass &objToCopy) // copy constructor

复制构造函数应采用const限定引用,如下所示:

standardClass(const standardClass &objToCopy)

您的赋值运算符也是如此:应该是

standardClass & operator=(const standardClass &objToCopy)

非限定const -限定的左值引用不能与临时对象一起使用,例如从文字4创建的临时对象。

你刚刚改变了整个类。问题是你有:

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

一切都会好起来的。