在下面的示例中,test.cpp
:
#include <iostream>
using namespace std;
class Rectangle {
public:
int w, h;
Rectangle() : w(7), h(0) {} // constructor definition.
Rectangle(int x, int y) : w(x), h(y) {} // constructor definition.
};
class MyClass {
public:
Rectangle trec;
MyClass() {
}
Rectangle getRect() {
return trec;
}
};
int main() {
MyClass a = MyClass();
cout << &a.getRect() << endl;
}
...使用
gcc test.cpp -o test.exe
编译时出现此错误:test.cpp: In function ‘int main()’:
test.cpp:32:22: error: taking address of temporary [-fpermissive]
cout << &a.getRect() << endl;
我真的不明白这里是什么临时的-
a
运行时会实例化cout
,所以a.trec
也应该实例化并有一个地址,这正是getRect()
返回的内容吗? (或者是否在return
上隐式创建一个副本,因为返回类型定义为Rectangle
而不是Rectangle*
吗?)无论如何,我都试图检查最初这样编写的代码,并且
a.trec
是private
,因此getRect()
是我唯一可以从我的代码中使用的东西-在这种情况下是否有机会打印a.trec
的地址? 最佳答案
getRect()
定义为
Rectangle getRect() {
return trec;
}
即使
trec
不是临时的trec
实际上也不是您要返回的内容。由于您按值返回,因此需要复制trec
并将其放入返回的函数中。该副本是临时的,您无法获取它的地址。如果将代码更改为
Rectangle& getRect() {
return trec;
}
要么
const Rectangle& getRect() {
return trec;
}
现在,我们引用
a
的成员,我们可以获取该引用的地址。