我有以下代码:
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
的返回值对称为copy
的CopyStack()
进行复制初始化的。没有作业。
Stack copy=CopyStack();
在此功能中,注释不正确。由于返回值是引用,因此没有调用复制构造函数。
Stack& Stack::CopyStack()
{
return *this; //this statement will invoke copy contructor
}
这意味着原始的初始化实际上是从
*this
变量进行的复制构造。如果返回值是按值返回的,那么复制初始化将来自一个临时对象,但是编译器可以有效地消除它。
我没有在
CopyStack
函数中看到要点。仅执行直接初始化会更加惯用:Stack copy(*this);