我认为这个问题最好用一小段代码我只是写问:当我通过引用传递一个对象并且超出了范围时,C++中会发生什么?
#include <iostream>
using namespace std;
class BasicClass
{
public:
BasicClass()
{
}
void print()
{
cout << "I'm printing" << endl;
}
};
class FriendlyClass
{
public:
FriendlyClass(BasicClass& myFriend) :
_myFriend(myFriend)
{
}
void printFriend()
{
cout << "Printing my friend: ";
_myFriend.print();
}
private:
BasicClass& _myFriend;
};
int main(int argv, char** argc)
{
FriendlyClass* fc;
{
BasicClass bc;
fc = new FriendlyClass(bc);
fc->printFriend();
}
fc->printFriend();
delete fc;
return 0;
}
代码编译和自定义g运行良好++:
$ g++ test.cc -o test
$ ./test
Printing my friend: I'm printing
Printing my friend: I'm printing
然而,这不是我的行为期待。在第二次致电fc->printFriend()
时,我期待着某种失败。我是否理解传递/存储引用的工作方式是不正确的,还是这种情况只是小规模工作,并可能在更复杂的应用程序中爆炸?
难道你不喜欢它,当我们都喊“未定义的行为!”一致? 8v) –
“我期待第二次出现某种失败”。只需使print()虚拟或将要打印的文本存储为std :: string成员变量,就会失败。 – SigTerm
您通常不希望引用为C++中的数据成员。您可能来自Java背景。 C++引用与Java引用完全不同。如果你想要一个像Java引用的东西,可以使用'std :: shared_ptr'并在堆上创建对象。 –
fredoverflow