-5

下面的这段代码工作正常。// 构造函数和析构函数的例子

#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;
}

但是为什么我不能使用下面的另一段代码呢?它没有使用下面的代码编译,但如果我强制运行它仍然会生成正确的结果。

#include <iostream>
using namespace std;

class CRectangle {
  //here I didn't initialize these two variables' pointers.
  int width, height;
public:
  CRectangle (int a,int b);
  ~CRectangle ();
  int area () {
    return (width * height);
  }
};

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

CRectangle::~CRectangle () {

}

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

2 回答 2

3

在您的第二段代码中

int area () {
   return (*width * *height);
}

.
.
.

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

在 中return (*width * *height);,您正在取消引用width并且height它们不是指针。此外,在您的析构函数中,您正在deleteingwidth并且height它们不是用初始化的指针,new因此是无效操作。正确的是

int area () {
   return (width * height);  // Do not dereference width and height
}

.
.
.

CRectangle::~CRectangle () {
  // Do something else without the deletes or remove the destructor altogether
}

此外,正如@chris 在他的评论中指出的那样,您还可以删除析构函数(确保同时删除声明和定义)。

于 2013-05-16T03:57:57.213 回答
1

在这里,您有一个结构,其中包含两个指向必须位于内存中其他位置的整数的指针。所以当CRectangle被创建时,有三个新对象:它CRectangle本身,然后是其他地方的两个整数。

在面向对象编程术语中,通过聚合CRectange与两个对象相关联。int

#include <iostream>
using namespace std;

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

现在,情况有所不同:两个int对象嵌入在一个CRectangle. 当您创建一个CRectangle对象时,这些整数已经存在于其中。它们在内存中有一个地址,因此您可以创建指向它们的指针,但它们是相对于CRectangle. 里面的成员函数CRectangle,当你访问width它的时候就真的意味着this->width。涉及到对象的指针,但不可见。如果我们有指向对象的指针,那么它的字段可以通过相对于指针的位移来找到。由于 C++ 不是汇编语言,因此编译器会为您计算出这种位移计算并生成机器代码。

和 两个整数之间的关联CRectangle现在是组合

class CRectangle {
  //here I didn't initialize these two variables' pointers.
  int width, height;
public:
  CRectangle (int a,int b);
  ~CRectangle ();
  int area () {
    return (*width * *height);
  }
};

area函数中,您不应该使用一元运算符*来解除指针引用,因为widthandheight不是指针。它不适用。(请确保您的示例在发布之前编译干净,除非示例专门说明了一些麻烦的非编译。)

于 2013-05-16T04:28:54.973 回答