这是一个简单的矩形区域,用于计算cpp代码,我对此有一些疑问:

#include <iostream>
#include <conio.h>
using namespace std;
class CRectangle
{
        int *width, *heigth;
    public:
        CRectangle(int, int);
        ~CRectangle();
        int area() { return (*width * *heigth);}
};

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

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

void main()
{
    CRectangle rect1(3,4), rect2(5,6);
    cout << "rect1 area = " << rect1.area() << "\n";
    cout << "rect2 area = " << rect2.area();
    getch();
}



为什么在这种面向对象的代码中我们使用指针,我的意思是什么?
在创建对象rect1(3,4)之后的这段代码中,我们创建了rect2(5,6),这样做(在逻辑上,我认为)5和6代替了width和height指向的内存部分中的3和4,所以3和4不再可用,但是它们可用。


请解释到底发生了什么?

最佳答案

1-为什么在这种面向对象的代码中我们使用指针,我的意思是什么?


没有了。


  2 3 3




    width = new int;
    heigth = new int;


您总是在每个构造函数调用中保留新的单独的内存位置。每个对象的宽度和高度都有单独的存储位置,因此不会被覆盖。

但是,在某些情况下,两个对象将共享相同的内存位置-如果您使用复制构造函数或赋值运算符将一个对象复制到另一个对象:

CRectangle rect1(3,4);
CRectangle rect2 = rect1;
CRectangle rect3(4, 5);
rect3 = rect1;


在这种情况下,widthheight的值与rect1的值相同,这将使所有三个对象指向相同的内存位置。在rect2的情况下,将不会调用默认构造函数,因此不会分配新的内存,而在rect3的情况下,widthheight的旧值将丢失,并且变量会使用rect1中的内存位置进行更新,这将导致您内存泄漏(因为在rect3的默认构造函数中分配的内存将永远不会释放)。

关于c++ - 有关"new"运算符的一些问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18663235/

10-09 22:46