0

関数からポインタを返す場合は、次のいずれかを記述できます。

const X* f();

また

X* const f();

、このようにして、ポインタを再割り当てできるかどうか、またはクラスを内部で変更できるかどうかを制御します。しかし、参照を返す場合、これら2つは同じ意味を持つようです。

const X& f();
X& const f();

Xを変更できるが、再割り当てできない参照を返すことは不可能のようです。そして、それが本当に不可能な場合、ポインタがこの領域で強力であると思われるときに、なぜ参照を返す必要があるのでしょうか。

更新:指摘されているように、参照を再割り当てすることはできません。しかし、これは私をさらに当惑させます。次のコードは、私が期待する3333ではなく3355を出力するからです。その参照とどのように一致するので、再割り当てできませんか?

struct X
{
   X(int i_) { i = i_;} 
   int i;
};

struct Y
{
    X& get2() {tmp2 = new X(55); return *tmp2;} 
    X& get() {tmp = new X(33); return *tmp;}    
    void print () {cout << tmp->i << endl;}
    X* tmp;
    X* tmp2;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Y y;    
    X& tmp2 = y.get2();
    X& tmp = y.get();       
    y.print();
    tmp = tmp2;
    y.print();
    return 0;
} 
4

4 に答える 4

10

Xを変更できるが、再割り当てできない参照を返すことは不可能のようです。

参照を再割り当てすることはできません。それらは、初期化時にバインドされているのと同じ指示対象を参照し続けます。

この領域でポインタが強力であると思われるのに、なぜ参照を返す必要があるのでしょうか。

参照の使用法はより直感的であり、関数の呼び出し元は、ユーザーが間接参照などを処理する必要があるポインターとは異なり、変数のように参照を使用できます。

于 2012-04-13T08:22:14.527 に答える
2

最初の2つの例は同じではありません。あなたはおそらく意味しました

const X* f();
X const* f();

実際、参照を使用して同じように書くことができます。

const X& f();
X const& f();

宣言X* const f();はあまり意味がありません。とにかく、返されたポインタを変更することはできません。それは単なる価値です。値を使用する(つまりf()->foo())か、保存する(つまりX* copy = f();)ことができます。また、値を格納する場合、定数は、値自体ではなく、値を格納した変数のみに依存します。比較int x = 4;-定数であるxという理由だけでconstになることはありません4

于 2012-04-13T08:21:37.057 に答える
2

更新の質問について:tmp=tmp2;を実行する場合。main関数では、tmp2への参照をtmpに割り当てていません。むしろ、オブジェクト全体をコピーしています。

これを確認するには、何かを出力するXコピーコンストラクターを指定します。このようなものが機能するはずです:

X(X& that)
{
    std::cout << "X is being copied" << std::endl;
    *this = that;
}
于 2012-04-13T08:51:51.473 に答える
0

Xを変更できるが、再割り当てできない参照を返すことは不可能のようです。

それはそう。参照は変数のエイリアスであり、再設定することはできません(つまり、別の変数のエイリアスに変更することはできません)。

そして、それが本当に不可能な場合、ポインタがこの領域で強力であると思われるときに、なぜ参照を返す必要があるのでしょうか。

それは効力の問題ではなく、意味論と責任の問題です。

ポインタ:

  • nullの可能性があります
  • オブジェクトの所有権を取得する必要があることを意味する場合があります(つまり、オブジェクトはによって作成され、破棄する必要がnewあります

参照にはこれらの問題がないため、より簡単です。そして、シンプルさは良いです。したがって、ポインタの力が必要ない場合は、その問題を回避し、参照を使用してください。

于 2012-04-13T08:41:23.387 に答える