2016-08-27 8 views
0

私は参照を理解しようとしています。
mはFooの中でFが割り当てられ、fooが終了したときにfが、Fooの中でスタック上に作成され、Fとそれが指すメモリはなりませんので、したがって、次のプログラム...この参照は無効になりますか?

void Foo(std::string& m) 
{ 
    std::string f = "Foo Stack Content"; 
    m = f; 
} 

int main() 
{ 
    std::string m = "Main Stack Content"; 
    Foo(m); 

    std::cout << m << std::endl; 
} 

を与えられましたもう有効です。それは今でもmも無効だということですか?

+2

参照を割り当てませんでした。値を割り当てた(そして、プロセスで 'std :: string'をコピー割り当てしました)。一度バインドされると、参照を変更することはできません。 – WhozCraig

+1

それはどのように動作するのですか?リファレンスは有効です。文字列fが参照によってFooに渡された文字列mにコピーされているからです。 – user

答えて

2

C++ classでは、定義された(オーバーロードされた)方法に応じて、演算子はdifferentの意味を持つことができます。あなたの場合、mは参照番号で、fは可変です。式m = fは、2つのクラスオブジェクト間の割り当てです(ウェル参照は厳密にはオブジェクトではありませんが、alias)。 std::stringはとfの間でdeep copyを実行します。つまり、fの値はmにコピーされます。また、ポインタと参照の間には根本的な違いがあることに注意してください。ポインタは、メモリに格納される実変数です。参照はaliasです。これらは同じ名前の異なる変数です

+0

@hvdこれはもっと明確ですか?コメントありがとうございました – KostasRim

+0

別の例として、=演算子をオーバーロードしない文字列クラスの代わりに別のクラスがあると、mは無効になりますか? – StackOverflowUser

+0

@StackOverflowUserクラス定義の仕方によって異なります。たとえば、文字列クラスがヒープ上に動的に割り当てられた 'char *'で構成されている場合、コピーは '浅いコピー 'になります(過負荷割り当て演算子が定義されていないため)。 'shallow copy 'はポインタコピーであり、オブジェクトが有効範囲外になり、' destructor'が呼び出されると、ポインタは無効なメモリ位置を指します(未定義の動作)。 – KostasRim

関連する問題