1

次のコードがあります。

    struct Y {
        string& s1; //string s1; throws no error
        Y( string src ) : s1(src) { cout<<"s1: "<<s1<<endl; }
        void show(){ cout<<s1<<endl; }
    };

    int main()
    {
        Y y1("Krypton");
        y1.show(); //run-time error
    }

y1.show() は「Krypton」を表示するはずですが、実行時エラーが発生します (y1.show() が呼び出されているときに s1 が初期化されていないためですか?)。

Q1. コンストラクターの初期化リストで既に初期化されているのに、s1 が初期化されないのはなぜですか? Q2. 文字列 s1 を使用しても同じエラーが発生しないのはなぜですか。参照の代わりに?

どんな助けでも大歓迎です。

よろしく、

ジェイ。

4

4 に答える 4

1

s1これはsrc一時オブジェクトであり、コンストラクターが存在すると破棄されます。

文字列を作成s1すると、依存しないローカル コピーになります。src

于 2013-07-07T09:39:42.587 に答える
1

一時的な参照を初期化しています。struct Yのインスタンスに単なる参照ではなく実際の文字列を保持させたい場合は、文字列への参照ではなく、文字列型のメンバー変数が必要です。

Q1. コンストラクターの初期化リストで既に初期化されているのに、s1 が初期化されないのはなぜですか?

初期化されましたが、存在しない文字列への参照になります。

Q2. 文字列 s1 を使用しても同じエラーが発生しないのはなぜですか。参照の代わりに?

クラスに文字列が含まれている場合、存在する文字列への参照は含まれていません。

参照はどの文字列への参照だと思いますか?

于 2013-07-07T09:39:45.950 に答える
0

コンストラクターがテンプレート値とこのテンプレート値へY(string src)の参照を受け入れたため、 print を呼び出すと、値はコンストラクターの後に破棄されます。s1show()

答え:

1.参照される値s1がコンストラクターの後に破棄されるため。

string s12.の代わりに使用すると、コンストラクターを呼び出すときに s1 をstring& s1代入し、s1のメンバーを出力します。srcshow()

「クリプトン」を鳴らしたい場合はY( string src )Y( string& src )

于 2013-07-07T09:57:00.220 に答える