关于析构函数

otianna 2009-02-11 05:38:59

#include <iostream>
using namespace std;
class Test
{
private:
static int iCounter; //声明一个静态变量记录构造函数的调用次数
public:
Test(); //声明构造函数
~Test(); //声明析构函数
};
int Test::iCounter=0; //谁能帮我解释一下这一条?
Test::Test()
{
iCounter++;
cout<<"调用构造函数!对象tObj"<<iCounter<<"开始"<<endl<<endl;
}
Test::~Test()
{
cout<<"调用析构函数!对象tObj"<<iCounter<<"结束"<<endl<<endl;
iCounter--;
}
Test tObj1;
int main()
{
cout<<"main()函数开始"<<endl;
Test tObj2;
{
cout<<"内部函数块开始"<<endl;
Test tObj3;
cout<<"内部函数块结束"<<endl;
}
cout<<"main()函数结束"<<endl;
return 0;
}

这道题目一个注释部分帮我解释一下,谢谢。
另外一个问题:
析构函数就是把构造函数部分的内存清除吗?如果不是的话起什么作用?
...全文
109 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸萌 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cppfaq 的回复:]
int Test::iCounter=0; //静态数据成员不能在声明处初始化,但如果静态成员是整型或是枚举型const,
//则可以在类声明中初始化!!!
[/Quote]
也是,但最好放在外面统一规范,放在cpp修改时可以尽量减少编译依赖
云风 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mydeardingxiaoli 的回复:]
静态变量属于整个类共有的属性, 不能在构造函数中初始化。
语义上析构函数与构造函数相反,确省什么都不做。
析构函数就是把构造函数部分的内存清除吗?是错误的,只有你在构造函数中存在动态分配的内存时才需要在析构函数中清除内存!
此处不存在清除内存,非动态分配的数据是由系统自动释放内存的,
此处析构,构造作用相反的,表现了C++引入析构,构造一点自动作用。
反复仔细看c++Primer
[/Quote]

正解!
cppfaq 2009-02-11
  • 打赏
  • 举报
回复
int Test::iCounter=0; //静态数据成员不能在声明处初始化,但如果静态成员是整型或是枚举型const,
//则可以在类声明中初始化!!!
lq651659889 2009-02-11
  • 打赏
  • 举报
回复
学习
waizqfor 2009-02-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 otianna 的帖子:]
C/C++ code
#include <iostream>
using namespace std;
class Test
{
private:
static int iCounter; //声明一个静态变量记录构造函数的调用次数
public:
Test(); //声明构造函数
~Test(); //声明析构函数
};
int Test::iCounter=0; //谁能帮我解释一下这一条?
Test::Test()
{
iCounter++;
cout<<"调用构造函数!对象tObj"<<iCounter<…
[/Quote]
int Test::iCounter=0;//对static成员变量的初始化0 因为是static所以在类外初始化
LZ看来对析构和构造还不够熟悉
http://topic.csdn.net/t/20020315/15/578698.html看看这里的回答
逸萌 2009-02-11
  • 打赏
  • 举报
回复
静态变量属于整个类共有的属性, 不能在构造函数中初始化。
语义上析构函数与构造函数相反,确省什么都不做。
析构函数就是把构造函数部分的内存清除吗?是错误的,只有你在构造函数中存在动态分配的内存时才需要在析构函数中清除内存!
此处不存在清除内存,非动态分配的数据是由系统自动释放内存的,
此处析构,构造作用相反的,表现了C++引入析构,构造一点自动作用。
反复仔细看c++Primer
lgccaa 2009-02-11
  • 打赏
  • 举报
回复


#include <iostream>
using namespace std;
class Test
{
private:
static int iCounter; //声明一个静态变量记录构造函数的调用次数
public:
Test(); //声明构造函数
~Test(); //声明析构函数
};
int Test::iCounter=0; //谁能帮我解释一下这一条?//这里是初始化iCounter,因为是静态变量,不能在构造函数中初始化
Test::Test()
{
iCounter++;
cout<<"调用构造函数!对象tObj"<<iCounter<<"开始"<<endl<<endl;
}
Test::~Test()
{
cout<<"调用析构函数!对象tObj"<<iCounter<<"结束"<<endl<<endl;
iCounter--;
}
Test tObj1;
int main()
{
cout<<"main()函数开始"<<endl;
Test tObj2;
{
cout<<"内部函数块开始"<<endl;
Test tObj3;
cout<<"内部函数块结束"<<endl;
}
cout<<"main()函数结束"<<endl;
return 0;
}







另外一个问题:
析构函数就是把构造函数部分的内存清除吗?如果不是的话起什么作用?

析构函数的作用是析构对象,这里iCounter其实是一个计数器,构造一个对象就加一,析构一个对象就减一,iCounter记录有多少个Test对象
yel_hb 2009-02-11
  • 打赏
  • 举报
回复
那不是将静态数据成员初始化么?如果不初始化,该值是一个随机数……
yel_hb 2009-02-11
  • 打赏
  • 举报
回复
那个不是将静态数据成员初始为0吗?如果不进行初始话,该值是一个随机数……

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧