Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23407
  • 博文数量: 2
  • 博客积分: 91
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-23 11:04
文章分类

全部博文(2)

文章存档

2009年(2)

我的朋友
最近访客

分类: C/C++

2009-03-23 18:02:30

问题:在c++中,struct 中包含class对象成员的时候,用ew分配内存,用delete释放的时候,该class的析构函数会被调用吗?

一个简单的例子:

#include <iostream>
using namespace std;
class Point
{
public:
    int x;
    int y;

    Point();
    ~Point();
};

struct Rect
{
    Point left_top;
    Point right_bottom;
};


Point::Point()
{
    cout<<"construct Point."<<endl;
}

Point::~Point()
{
    cout<<"destruct Point."<<endl;
}

int main()

{
    Rect rt;
    Rect *prt;

    cout<<"--------------------------"<<endl;

    prt = new Rect();
    delete prt;

    cout<<"--------------------------"<<endl;
}

输出结果:
construct Point.
construct Point.
--------------------------
construct Point.
construct Point.
destruct Point.
destruct Point.
--------------------------
destruct Point.
destruct Point.

从输出结果可以很明显的看出,不管是在栈上分配空间还是在堆上通过new来分配内存都会调用Point的构造函数。
 
Rect rt;定义一个Rect对象,在栈上分配空间,调用了Point的构造函数,因为有两个点,所以调用了两次。
 
而prt = new Rect();用new为Rect的指针prt分配空间,使用delete释放。调用两次构造两次析构。最后分割线下面的则是程序函数退出前要做的工作,释放栈上的空间,调用了两次构造函数。
 
其实在C++中struct和class是没有什么本质区别的(可以参考《深度探索 C++对象模型》1.2关键词所带来的差异一节),不同的是在C++中struct默认的访问权限是public,而class是private。在C++中要使用C中的struct就要通过下面的方式:

 

#ifdef __cplusplus
extern "C"{
#endif

struct Point
{
    x;
    y;
};

#ifdef __cplusplus
}
#endif

阅读(1895) | 评论(0) | 转发(0) |
0

上一篇:RO段、RW段和ZI段

下一篇:没有了

给主人留下些什么吧!~~