-1

で以下のコードを見ましたStackoverflow.com。私は疑いがあるので、同じコードを探していました。以下のコードが表示される場合
CRectangle r1, *r2; r2= new CRectangle;
1. なぜ実行するのnew CRectangleですか? 私たちは実際に何をしようとしているのでしょうか。

  1. 同僚の 1 人は、私たちが作成したコードを書くときに
    CRectangle *r2 = 0;

次にinitialize、他の値またはアドレスを使用します。私は本当に混乱しました。私を助けてください。

using namespace std; 
class CRectangle
{
    int width, height;  
public:    
    void set_values (int, int);  
    int area (void) {return (width * height);
    } 
}; 
void CRectangle::set_values (int a, int b) 
{    
    width = a;   
    height = b;
} 
int main () 
{   
    CRectangle r1, *r2;    
    r2= new CRectangle;    
    r1.set_values (1,2);  
    r2->set_values (3,4);   
    cout << "r1.area(): " << r1.area() << endl;    
    cout << "r2->area(): " << r2->area() << endl;  
    cout << "(*r2).area(): " << (*r2).area() << endl;  
    delete r2;    
    return 0; 
} 
4

3 に答える 3

1

CRectangle r1、* r2; r2=新しいCRectangle;

r1オブジェクトです。r2オブジェクトへのポインタです。

CRectangle *r2 = 0;

ポインタには、オブジェクトのアドレスが含まれています。ポインターが初期化されていない場合は、任意の値をとることができます(不明です)。したがって、0ポインタの値がわかるように初期化します0。その値を使用して、二重初期化やメモリエラーを回避できます。

オブジェクトをポインタに割り当てようとしているとき、私たちが通常行うことは_

if (r2 == 0)
    r2 = new CRectangle;
else
    std::cout << "Pointer is not empty or invalid" << std::endl;
于 2012-08-22T06:28:15.237 に答える
1

あなたの例r1では、CRectangleクラスのr2タイプがありますが、CRectangleクラスへのポインタのタイプがあります。ポインタは、グローバルメモリ(ヒープ)内のアドレスです。CRectangleメモリをオブジェクトとして割り当ててマークするには、を使用する必要がありますnew

書籍の詳細をお読みください

于 2012-08-22T06:28:40.013 に答える
1
CRectangle r1, *r2;    
r2= new CRectangle;

CRectangleこのコードは、オブジェクト( )と、まだ何も指していないオブジェクトr1へのポインター()を宣言します。両方の変数がスタックに割り当てられます。CRectangler2

2行目は、(ヒープからの)新しいオブジェクトにメモリを割り当てCRectangle、そのクラスのコンストラクターを呼び出してから、アドレスを返し、それをに割り当てますr2。したがってr2、オブジェクトを指しCRectangleます。

r20に設定するかNULL、ポインタが実際には何も指していないことを示すための単なる標準的な方法です。

于 2012-08-22T06:28:53.867 に答える