在下面的示例中,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
的地址?
答案 0 :(得分:7)
getRect()
定义为
Rectangle getRect() {
return trec;
}
即使trec
不是临时的trec
,实际上并不是你要归还的。由于您按值返回,因此您将复制trec
并将其放入函数返回中。该副本是暂时的,你不能拿它的地址。
如果您将代码更改为
Rectangle& getRect() {
return trec;
}
或
const Rectangle& getRect() {
return trec;
}
现在我们引用a
的成员,我们可以获取该引用的地址。
答案 1 :(得分:2)
os.listdir()
返回Rectangle getRect() {
return trec;
}
的副本。您不能保存此副本,并尝试取一个临时的地址,这是非法的。
您可以改为返回引用(或指针而不是反复),然后打印出该地址:
trec