我有以下代码:

void Stack::operator =(Stack &rhs)
{
    //do the actual copying
}

Stack::Stack(Stack &rhs) //copy-constructor
{
    top=NULL; //initialize this as an empty stack (which it is)
    *this=rhs; //invoke assignment operator
}

Stack& Stack::CopyStack()
{
    return *this; //this statement will invoke copy contructor
}

它的用法如下:
unsigned Stack::count()
{
    unsigned c=0;
    Stack copy=CopyStack();
    while (!copy.empty())
    {
        copy.pop();
        c++;
    }
    return c;
}

从CopyStack的声明中删除引用符号(返回副本而不是引用)在Visual Studio 2008中没有任何区别(相对于调用复制的次数)。我猜想它已经被优化了-通常它应该首先为返回值制作一个副本,然后再次调用赋值运算符将其分配给变量sc。

您在不同的编译器中进行这种优化有什么经验?

问候,
哲南

最佳答案

该语句是根据Stack的返回值对称为copyCopyStack()进行复制初始化的。没有作业。

Stack copy=CopyStack();

在此功能中,注释不正确。由于返回值是引用,因此没有调用复制构造函数。
Stack& Stack::CopyStack()
{
    return *this; //this statement will invoke copy contructor
}

这意味着原始的初始化实际上是从*this变量进行的复制构造。

如果返回值是按值返回的,那么复制初始化将来自一个临时对象,但是编译器可以有效地消除它。

我没有在CopyStack函数中看到要点。仅执行直接初始化会更加惯用:
Stack copy(*this);

09-30 15:23
查看更多