2

参照によるオブジェクトの受け渡しと特定のクラスの関数への値による受け渡しの違いについて、私は混乱しています。オブジェクトを値で渡すと、デフォルトのコピーコンストラクターが、指定された関数で使用するオブジェクトのメンバーごとのコピーを作成することがわかります。ただし、ディープコピーを必要とするクラスのconst参照としてオブジェクトを渡す場合でも、コピーコンストラクターは呼び出されますか?私が機能を持っていたと言う

     void debug(const MyClass& object1); 

object1を渡すと、コピーコンストラクターが呼び出されますか?または、コピーを作成せずにオブジェクトを関数に直接渡しますか?もう1つの質問-Fractionというクラスがある場合-

     Fraction A(1,2); // 1 is this numerator, 2 the denominator

     A = Fraction(2,3);

前述の行は、デフォルトのコンストラクターを呼び出して一時オブジェクトFraction(2,3)を作成し、次に代入演算子を作成しますか?

ありがとう。

4

3 に答える 3

2

以下では[x]、xがオプションであることを意味すると見なします。

参照によるオブジェクトの受け渡しと特定のクラスの関数への値による受け渡しの違いについて、私は混乱しています。

オブジェクトを値で渡す場合、プログラムは関数のローカルオブジェクトを作成する必要があるため、クラスのコピーコンストラクターを呼び出してこのオブジェクトを作成します。参照によって(そして一見ポインタによって)渡す場合object1、関数内の変数は、関数に渡したオブジェクトの単なるエイリアスです。したがって、関数内のものを編集すると、編集は外部オブジェクトにも適用されます。

前述の行は、デフォルトのコンストラクターを呼び出して一時オブジェクトFraction(2,3)を作成し、次に代入演算子を作成しますか?

代入演算子です。Aすでに宣言されている型の変数であると見なすと、それXが呼び出されるX Fraction::operator=([const] Fraction[&])か、互換性のある型になります。

Fraction x = Fraction(2, 3)注意:期待どおりに使用されないことを宣言するoperator=と、代わりに対応するコンストラクターが呼び出されます(この場合Fraction::Fraction([const] Fraction[&]))。

于 2013-03-25T02:22:01.003 に答える
2

Would passing object1 call the copy constructor?

いいえ、参照によって渡されるため、コピーコンストラクタは呼び出されません。この場合、コピーは作成されません。

A = Fraction(2,3);

はい、2つのパラメーターを使用してコンストラクター(または、両方のパラメーターにデフォルト値がある場合はデフォルトのコンストラクター)を呼び出してから、コピー代入演算子を呼び出します。

以下のコードからの出力を見ることができます:

 #include <iostream>
 using namespace std;
 class Fraction
 {
  public:
  int denom;
  int nominator;
  Fraction(int d , int n ):denom(d), nominator(n)
  {
    cout << "call non-copy constructor" <<endl;
  }

  Fraction(const Fraction&  rhs)
  {
    cout << "call copy constructor" <<endl;
    denom = rhs.denom;
    nominator = rhs.nominator;
  }

  const Fraction& operator=(const Fraction&  rhs)
  {
   cout << "call copy assignment operator" << endl;
   if (this == &rhs)
   {
      return *this;
   }

   denom = rhs.denom;
   nominator = rhs.nominator;
   return *this;
   }
};

void debug(const Fraction& obj)
{
  cout << "this is debug: pass by reference " <<endl;
}

void debugPassByValue(Fraction obj)
{
  cout << "this is debug: pass by value" <<endl;
}

int main()
{
  Fraction A(1,2);
  cout << "--------------" <<endl;
  debug(A);
  cout << "--------------" <<endl;
  A = Fraction(2,3);
  cout << "--------------" <<endl;
  debugPassByValue(A);
  cout << "--------------" <<endl;
  cin.get();
  return 0;

}

次の出力が表示されます。

call non-copy constructor  //Fraction A(1,2);
--------------
this is debug: pass by reference  //debug(A);
--------------
call non-copy constructor    //A = Fraction(2,3);---> construct temporary object
call copy assignment operator  //A = Fraction(2,3);
--------------
call copy constructor   //debugPassByValue(A);
this is debug: pass by value
--------------

これで、いわゆるものがより明確に表示されます。

于 2013-03-25T02:23:27.810 に答える
1

実際、debugコピーが作成されていない場合。

2番目のケースでは、あなたの質問を理解できるかどうかはよくわかりません。この行:

A = Fraction(2,3);

Fractionの代入演算子を使用する必要があります。Aすでに存在するため、インスタンスで代入演算子を使用してAFraction(2,3)一時オブジェクトである代入演算子を使用します。

于 2013-03-25T02:06:46.623 に答える