通过引用和值返回*之间的区别

时间:2013-04-17 12:42:56

标签: c++ pointers

如果跟随代码示例之间存在差异吗?

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


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

如果跟随代码示例之间存在差异?是一样的吗?

5 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:3)

第一个复制*this,第二个复制{。}。

答案 2 :(得分:3)

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

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

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

如果您拨打getOwnOne()方法,则会显示该消息。 getOwnTwo()不会。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

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