0

次の C++ コードを検討してください。

// friend functions
#include <iostream>
using namespace std;

class CRectangle {
  int width, height;
 public:
  void set_values (int, int);
  int area () {return (width * height);}
  friend CRectangle duplicate (CRectangle);
};

void CRectangle::set_values (int a, int b) {
 width = a;
 height = b;
}

CRectangle duplicate (CRectangle rectparam)
{
   CRectangle rectres; // Defined without using new keyword. This means scope of this variable of in this function, right ?
   rectres.width = rectparam.width*2;
   rectres.height = rectparam.height*2;
   return (rectres);
}

int main () {
  CRectangle rect, rectb;
  rect.set_values (2,3);
  rectb = duplicate (rect);
  cout << rectb.area();
  return 0;
}

変数「CRectangle rectres」は、関数「CRectangle duplicate」で定義されています。

  1. これは、変数「CRectangle rectres」のスコープが関数のみに限定されていることを意味しますか? (newキーワードを使わずに定義しているため)

  2. 上記の質問に対する答えが「はい」の場合、どのように返すことができますか (ローカル変数であるため) ?

クレジット: コードの引用: http://www.cplusplus.com/doc/tutorial/inheritance/

4

2 に答える 2

1

1 と 2 に関するあなたの質問は、Patrick によって適切に回答されましたが、少し拡張できると思いました。

構造体またはクラス オブジェクトを返すときに MOST コンパイラが動作する方法 [1] は、呼び出し元の関数が "return here" 値のポインター引数 (ビューから隠されている) を渡すことです。したがって、呼び出された関数は、呼び出し元のコードによって提供された場所に結果をコピーします。実際のコピーは、クラスのコピー コンストラクターによって行われます。

注 1: C++ 標準では、コンパイラがこれを行う方法は規定されていません。また、スター ウォーズの「ザ フォース」を使用してビットを移動するだけの魔法のコードをコンパイラが生成できる場合、それも標準に従って許可されます。

于 2013-08-12T10:02:19.600 に答える