私はこの質問は最高の私は書いた小さなコードスニペットを問われると思う:オブジェクトを参照渡しすると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()
への2回目の呼び出しで何らかの失敗が予想されていました。参照渡し/格納がどのように正しく動作しないのか、小規模でしか機能しないようなもので、より洗練されたアプリケーションで爆発する可能性があるという私の理解はありますか?
私たちは皆、「未定義の振る舞い」を叫ぶと、あなたはそれを愛しませんか?斉唱中? 8v) –
"私は2番目に何らかの失敗が予想されていました"。単純にprint()を仮想的にするか、印刷しているテキストをstd :: stringメンバ変数として格納すれば、失敗に終わります。 – SigTerm
一般的にC++のデータメンバーとしての参照は不要です。あなたはおそらくJavaの背景から来ています。 C++のリファレンスは、Javaリファレンスのようなものではありません。 Javaリファレンスのようなものが必要な場合は、 'std :: shared_ptr'を使ってヒープ上にオブジェクトを作成してください。 –
fredoverflow