-4

質問が非常に基本的な場合は申し訳ありません。

プログラム 1:

#include <iostream>
using namespace std;

int   max(int &a)
{
   a +=100;
   return a;
}

int main ( int argc, char ** argv)
{

  int x=20;
  int y;
  y = max(x);
  cout <<"x , y value is  "<<x<<"and"<<y<<endl;
 }

出力:

x、y の値は 120 と 120 です

プログラム 2:

#include <iostream>
using namespace std;

int & max(int &a)
{
   a +=100;
   return a;
}

int main ( int argc, char ** argv)
{

  int x=20;
  int y;
  y = max(x);
  cout <<"x , y value is  "<<x<<"and"<<y<<endl;
 }

出力:

x、y の値は 120 と 120 です

PROGRAM1 と PROGRAM2 の唯一の違いは、2 番目のプログラムが参照によって戻ることです。違いは正確には何ですか?

4

6 に答える 6

1

PROGRAM1:それを返すときに参照された変数aをコピーします。
PROGRAM2:参照された変数自体への参照を返します(同じ参照、実際には?)。

どちらの方法でも値が変数 'y' にコピーされるため、出力に違いはありません

ただし、はよりも1 回多くコピー操作PROGRAM1を実行します。PROGRAM2

あなたが好きなときに問題が発生します:

int&  max(int a) // a is  value variable
{
   a +=100;
   int &a1 = a
   return a1;  // you are returning reference to  local 
}

ここで、このバージョンのmax()変数aスコープは max() に対してローカルであり、戻り参照がa. その後、スタックに割り当てられた私は立ち去り、あなたは何も参照していません。違う!

詳細については、こちらをご覧ください

于 2013-03-01T14:31:32.880 に答える
0

ローカル変数の値を返した場合、2番目の値は正しくありません。ただし、これらのバリアントの違いは、2番目のバリアントの関数maxが、その中で変更された元のオブジェクトを返すことだけです。最初のものはどうですか?変更後に元の値のコピーを返します。

したがって、intではなくフィールドでいっぱいの別の大きな型を使用する場合は、2番目の型を使用することをお勧めします。

于 2013-03-01T14:35:28.913 に答える
0

2つのプログラムの唯一の違いは、の値が別の場所xにコピーされていることですx[実際のコードでは、コンパイラが「不要な」コピーを最適化するため、実際にはまったく違いはありません] 。

最初の関数でaは、はmainのエイリアスであり、関数の戻り値xにコピーさreturn a;れます[x86では、eaxコンパイラのすべてのバリアントで、それらがどのように機能するかを知っています]。したがって、の値のコピーを返しますx

2番目の例では、の同じエイリアシングがx適用されますが、「エイリアス」が返されます。実際には、コードは次のように読み取られます。

   int y;
   max(x);
   y = x;

このコードの目的には実際には違いはありませんが、次のようなものがある場合は次のようになります。

int &max(int &x, int &x)
{
    if (x > y) return x;
    return y;
}


int main()
{
   int a = 10;
   int b = 13;

   int& c = max(a, b);

   c = 12;

   cout << "a=" << a << " b=" << b << " c=" << c;
}

これで、のエイリアスになるため、bの値が与えられていることがわかります。12cb

于 2013-03-01T14:36:11.983 に答える
0

2 つのプログラムに問題はありません。この問題は、関数のローカル変数を参照によって返す場合にのみ発生します。これは、その参照が関数の最後で消えるためです。ただし、使用しaているため、関数呼び出し後もスコープ内にあります。

于 2013-03-01T14:28:21.743 に答える
0

私が理解しているように、値で返すと新しい変数が作成され、参照で返すと元の変数への参照が返されるため、メモリ割り当てが節約されます。

整数の場合、参照は整数値と同じ量のメモリ領域を占有するため、違いはおそらく学術的なものです。

于 2013-03-01T14:31:32.977 に答える
0

私の知る限り、両方のプログラムはまったく同じです。正しいコードをコピーしていませんか? 一般に、変数を参照渡しすると、元の変数が変更されます。値で渡す場合、変数のコピーを渡します。つまり、変数を参照渡しして変更を加えると、元の変数も変更されます。値渡しの場合はそうではありません。

于 2013-03-01T14:43:05.540 に答える