0

私は C++ ドキュメンテーション チュートリアルに取り組んでいますが、コンストラクターでポインターを使用するこの例を理解するのに苦労しています。

// example on constructors and destructors
#include <iostream>
using namespace std;

class CRectangle {
    int *width, *height;
  public:
    CRectangle (int,int);
    ~CRectangle ();
    int area () {return (*width * *height);}
};

CRectangle::CRectangle (int a, int b) {
  width = new int;
  height = new int;
  *width = a;
  *height = b;
}

CRectangle::~CRectangle () {
  delete width;
  delete height;
}

int main () {
  CRectangle rect (3,4), rectb (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  return 0;
}

ポインタ*widthが2回宣言されているようです。クラスの最初で宣言されint *width, *height;、コンストラクターが初期化されるときにも宣言されますwidth = new int;

ポインターを 2 回宣言する必要があるのはなぜですか?

4

6 に答える 6

4

いいえ、一度だけ宣言され、コンストラクターで値が割り当てられます。

于 2013-05-15T12:25:53.930 に答える
3

1) 幅 = 新しい整数。

 It is not a declaration. You are allocating memory and assigning to width. 

2) int *with -> は宣言です。

お役に立てれば。

于 2013-05-15T12:26:41.750 に答える
1

変数は、ステートメントを使用して、クラス本体で宣言されます (つまり、int へのポインターがwidthおよびheightという名前で存在することをコンパイラーに伝えます) int *width, *height;

コンストラクターでは、 new 演算子を使用して値が割り当てられますが、これは宣言ではありません。

于 2013-05-15T12:26:11.737 に答える
1

幅 = 新しい整数; 宣言せず、ヒープからメモリを割り当てます。

于 2013-05-15T12:26:52.620 に答える
0

int *width, *height; これはプレースホルダーを宣言するだけです

width = new int;実際にメモリを割り当てます

くすくす笑うためnewに、コンストラクターですべてをコメントしてみてください...プログラムクラッシュする可能性があります(http://ideone.com/bnxvKA)または未定義の動作が発生します。

于 2013-05-15T12:26:38.837 に答える
0

幅と高さは 1 回だけ宣言されます。

まず、幅と高さが*int

class CRectangle {
    int *width, *height; // declaration

(...)

次に、幅と高さの値 (ポインター) を指定します。

CRectangle::CRectangle (int a, int b) {
  width = new int; // assignment
于 2013-05-15T12:26:57.567 に答える