3

https://cs.senecac.on.ca/~chris.szalwinski/archives/oop244.071/content/custo_p.htmlのアドレスでC++テキストを読んでいます。「参照を返す」セクションで、著者は次のように書いています。

関数から参照を返すことには、2つの本質的な利点があります

  • 効率

  • 左辺値を作成します

「」

最初のメリット(効率)は理解できますが、2番目のメリットがなぜなのかわかりません。

著者が説明したように、私は何であるかを理解できますが、関数からの参照を返すlvalueこととの関係が何であるかを理解していないので、それは利点になりますか?lvaluelvalue

4

1 に答える 1

5

これは単に、関数の結果に何かを割り当てることができることを意味します。この例を考えてみましょう。

int& foo() {
  static int x;
  return x;
}

void bar() {
  foo() = 42;
}

intもちろん、の代わりに、これはクラスオブジェクトでも機能します。x重要なのは、呼び出し元に参照を返すことで、でローカルスコープの変数を直接割り当てることができるということfooです。これは、参照の戻り値が「左辺値を作成する」と著者が言っていることを意味します。

ちなみに、この例には実際にアプリケーションがあります。これは、より複雑なタイプの静的初期化順序の大失敗intを解決するためです。

編集

「メリット」については、これを解釈する方法がいくつかあります。これは、コードを読みやすくする方法(ポインターで実装された同じ機能とは対照的)であるか、左辺値にのみ適用できる操作を使用できる方法です。これは、参照を返さない場合は不可能です。ポインタが引数を受け取りました:

struct X {
  int a;
  int b;
};
class Y_withoutRefs {
  private:
    X x;
  public:
    void setXa(int a) {
      x.a = a;
    }
    int getXa() {
      return x.a;
    }
    void setXb(int b) {
      x.b = b;
    }
    int getXb() {
      return x.b;
    }
};
class Y_withRefs {
  private:
    X x;
  public:
    X& getX() {
      return x;
    }
};

void dosmth() {
  Y_withoutRefs ywo;
  Y_withRefs yw;
  ywo.setXa(50+ywo.getXa());
  yw.getX() += 50;
}
于 2011-09-12T02:36:20.177 に答える