后面的代码示例之间是否存在差异?
ClassTwo ClassTwo::getOwnOne(){
return *this;
}
ClassTwo& ClassTwo::getOwnTwo(){
return *this;
}
后面的代码示例之间是否存在差异?一样吗?
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
第三个是错误,因为您无法将可变引用绑定到临时对象。
第一个复制*this
,第二个不复制。
他们不一样。第一个将隐式调用复制构造函数并返回对象的副本。第二个将返回对它的引用。
您可以通过向您的类添加一个复制构造函数来验证这一点,就像这样(一个没用的,只是为了显示一条消息):
ClassTwo(const ClassTwo& in)
{
cout << "I am the copy constructor" << endl;
}
如果您调用您的getOwnOne()
方法,它将显示该消息。习以为常getOwnTwo()
。
第一个定义返回您正在调用 getOwnOne 的对象的副本。这意味着当您调用此方法时,您将调用类的构造函数。
第二种方法返回对您正在调用 getOwnTwo 的对象的引用。