-1

我在Stackoverflow.com. 我正在寻找相同的代码,因为我有疑问。如果我们将看到下面的代码
CRectangle r1, *r2; r2= new CRectangle;
1. 我们为什么要这样做new CRectangle?我们实际上想要做什么?

  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

C矩形 r1, *r2; r2=新的CRectangle;

r1是对象。r2是指向对象的指针。

CRectangle *r2 = 0;

指针包含对象的地址。如果指针没有初始化,它可以有任何值(我们不知道)。因此,我们进行初始化0,以便我们知道我们的指针具有 value 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) 和一个指向CRectangle对象的指针,该对象还没有指向任何东西 ( r2)。这两个变量都分配在堆栈上。

第二行为新CRectangle对象(从堆中)分配内存,调用该类的任何构造函数,然后返回地址并将其分配给r2. 所以r2then 指向一个CRectangle对象。

Setting r2 to 0 or NULL is simply a standard way to indicate that the pointer doesn't actually point to anything.

于 2012-08-22T06:28:53.867 回答