缺少预期的对象构造

时间:2012-07-31 22:07:45

标签: c++ c++11

class A
{
public:

    A ()
    {
        wcout << L"Empty constructed." << endl;
    }

    A (LPCWSTR Name)
        : m_Name(Name)
    {
        wcout << L"Constructed." << endl;
    }

    friend void swap (A& Lhs, A& Rhs)
    {
        using std::swap;

        swap(Lhs.m_Name, Rhs.m_Name);
    }

    A (A&& Other)
    {
        wcout << L"Move constructed." << endl;

        swap(*this, Other);
    }

    A (const A& Other)
        : m_Name(Other.m_Name)
    {
        wcout << L"Copy constructed." << endl;
    }

    A& operator= (A Other)
    {
        wcout << L"Assignment." << endl;

        swap(*this, Other);

        return *this;
    }

    ~A ()
    {
        wcout << L"Destroyed: " << m_Name.GetString() << endl;
    }

private:

    CString m_Name;
};


int
wmain ()
{
    A a;

    a = A(L"Name"); // Where is the construction of this temp object?

    return 0;
}

这是我获得上述代码的输出:

Empty constructed.
Constructed.
Assignment.
Destroyed:
Destroyed: Name

查看评论行。我期望在那里构造一个临时对象,并且operator =中的参数Other将从该临时对象中移动构造。这里发生了什么?

2 个答案:

答案 0 :(得分:8)

显示“Constructed”的输出实际上是来自该临时对象构造的反馈。

如果您正在寻找复制赋值运算符的Other参数的附加复制构造(或移动构造),则可能通过复制省略来消除它。您的A(L"Name")会立即构建并用作Other参数。不执行额外的复制(或移动)。

答案 1 :(得分:2)

您可以使用交互式调试器自行查看。但是,您对“名称”构造的答案是:

A (LPCWSTR Name) 
    : m_Name(Name) 
{ 
    wcout << L"Constructed." << endl; 
} 

 a = A(L"Name");

您的代码在代码行A a;构建了一个空对象。

然后构建“名称”。

然后它交换了两个CString m_Name;(由输出Assignment显示)。

然后它破坏了持有“名字”(A(L"Name"))的原始对象。

然后它破坏了原来的空对象,该对象现在在m_Name中保留了“名称”。