如果跟随代码示例之间存在差异吗?
ClassTwo ClassTwo::getOwnOne(){
return *this;
}
ClassTwo& ClassTwo::getOwnTwo(){
return *this;
}
如果跟随代码示例之间存在差异?是一样的吗?
答案 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)