-3

后面的代码示例之间是否存在差异?

ClassTwo ClassTwo::getOwnOne(){
    return *this;
}


 ClassTwo& ClassTwo::getOwnTwo(){
    return *this;
}

后面的代码示例之间是否存在差异?一样吗?

4

5 回答 5

9
ClassTwo ClassTwo::getOwnOne()

这将返回调用它的对象的副本。

ClassTwo& ClassTwo::getOwnTwo()

这将返回对调用它的对象的引用。

如果您使用结果创建一个新对象,它们都会(或多或少)做同样的事情:

ClassTwo c2a = c2.getOwnOne(); // New object
ClassTwo c2b = c2.getOwnTwo(); // New object too

但如果您使用它们来初始化引用,则不同:

ClassTwo const & c2a = c2.getOwnOne(); // New object (lifetime tied to reference)
ClassTwo const & c2b = c2.getOwnTwo(); // Reference to c2

ClassTwo & c2a = c2.getOwnOne(); // ERROR
ClassTwo & c2b = c2.getOwnTwo(); // Reference to c2

第三个是错误,因为您无法将可变引用绑定到临时对象。

于 2013-04-17T12:44:14.677 回答
3

第一个复制*this,第二个不复制。

于 2013-04-17T12:43:59.230 回答
3

他们一样。第一个将隐式调用复制构造函数并返回对象的副本。第二个将返回对它的引用。

您可以通过向您的类添加一个复制构造函数来验证这一点,就像这样(一个没用的,只是为了显示一条消息):

ClassTwo(const ClassTwo& in)
{
  cout << "I am the copy constructor" << endl;
}

如果您调用您的getOwnOne()方法,它将显示该消息。习以为常getOwnTwo()

于 2013-04-17T12:44:23.203 回答
2

第一个定义返回您正在调用 getOwnOne 的对象的副本。这意味着当您调用此方法时,您将调用类的构造函数。

第二种方法返回对您正在调用 getOwnTwo 的对象的引用。

于 2013-04-17T12:45:06.113 回答
1

看看这个第二类可以有未定义的行为

也许因为你得到相同的输出。它让你觉得他们是一样的。

第一个返回,current object而第二个将返回的对象类型转换为其引用

于 2013-04-17T12:47:26.180 回答