C++:析构函数
析构函数的特点:
1、析构函数与类名相同,但它前面必须加上波浪号~
2、析构函数不返回任何值,在定义析构函数时,是不能说明它的类型的,甚至说明void类型也不能
3、析构函数没有参数,因此不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数
4、撤销对象时,编译系统会自动调用析构函数
//例3.13 含有析构函数和构造函数的Conplex类 #include<iostream>
#include<cmath>
using namespace std;
class Complex{
public:
Complex(double r=0.0,double i=0.0); //声明默认参数的构造函数
~Complex(); //声明析构函数
double abscomplex(); //声明abscomplex函数
private:
double real;
double imag;
};
Complex::Complex(double r,double i) //定义构造函数
{
real = r;
imag = i;
cout<<"Constructor called"<<endl;
}
Complex::~Complex() //定义析构函数
{
cout<<"Destructor called"<<endl;
}
double Complex::abscomplex() //定义abscomplex函数
{
double t;
t = real*real+imag*imag;
return sqrt(t);
}
int main()
{
Complex A(1.1,2.2);
cout<<"复数的绝对值是:"<<A.abscomplex()<<endl;
return ;
}
说明:
(1)每个类必须有一个析构函数。若没有显式的为一个类定义析构函数,则编译系统
会自动生成一个默认的析构函数。例如,编译系统为类Complex生成类似如下述形式的默认
析构函数:Complex::~Complex(){}
类似于系统自动生成的默认构造函数,这个自动生成的默认析构函数的函数体也是空的,但是
它能完成释放对象所占的内存空间的任务。
对于大多数类而言,这个默认析构函数就能满足要求。但是,如果在一个对象撤销之前
需求完成另外一些处理工作的话,则应该显示地定义析构函数,例如:
class String_data{
public:
String_data(char *s) //构造函数
{
str = new char[strlen(s)+]; //用运算符new为字符串str动态的分配一个存储空间
strcpy(str,s);
}
~String_data(); //析构函数
{
delete str; //用delete运算符释放动态分配的存储空间
}
void get_info(char *);
void sent_info(char *);
private:
char *str;
};
这是构造函数和析构函数常见的用法,即在构造函数中用new运算符为字符串分配存储空间
,最后在析构函数中通过delete运算符释放已分配的存储空间。
(2)除了在主函数结束(或调用exit函数)时,对象被撤销,系统会自动调用析构函数函数
外,在以下的情况下,析构函数也会被调用:
a、如果一个对象被定义在函数体内,则当这个函数被调用结束时,该对象将释放,析构
函数被自动调用。
b、若一个对象是使用new运算符动态创建的,在使用delete运算符释放它时,delete会
自动调用析构函数。
#include<iostream>
using namespace std;
class String_data{
public:
String_data(char *s) //构造函数
{
str = new char[strlen(s)+]; //用运算符new为字符串str动态的分配一个存储空间
strcpy(str,s);
}
~String_data() //析构函数
{
cout<<"Destructor"<<endl;
delete str; //用delete运算符释放动态分配的存储空间
}
void get_info(char *);
private:
char *str;
};
void String_data::get_info(char *str1)
{
str = str1;
cout<<str<<endl;
}
int main()
{
String_data sd("abc");
sd.get_info("xiayuanquan");
return ;
}
C++:析构函数的更多相关文章
- .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...
- 【C#】析构函数
MSDN paper 析构函数 析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数. 析构函数往往用来做“清理善后” 的工作( ...
- c++虚析构函数
虚析构函数的作用主要是当通过基类指针删除派生类对象时,调用派生类的析构函数(如果没有将不会调用派生类析构函数) #include <iostream> using namespace st ...
- 转:Delphi2010新发现-类的构造和析构函数功能
Delphi2010发布了. 虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究. 今天有点时间试了一下新功能. 本来C#和Delphi.NE ...
- c++单例模式为什么不在析构函数中释放静态的单例对象(转)
需要清楚一下几点: 1.单例中的 new 的对象需要delete释放. 2.delete释放对象的时候才会调用对象的析构函数. 3.如果在析构函数里调用delete,那么程序结束时,根本进 ...
- C++构造函数/析构函数 设置成private的原因
C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...
- 关于GC和析构函数的一个趣题
这个有趣的问题感谢装配脑袋友情提供. 请看如下代码: public class Dummy { public static Dummy Instance; ; ~Dummy() { Instance ...
- C++构造函数和析构函数
构造函数简介 在上一个章节我们在创建好类的对象之后,首先对它的每一个成员属性赋值之后再对它们进行输出操作,如果不赋值就输出,这些值就会是垃圾值.而为了代码的简介,一次性为所有成员属性初始化,C++的类 ...
- virtual 修饰符与继承对析构函数的影响(C++)
以前,知道了虚函数表的低效性之后,一直尽量避免使用之.所以,在最近的工程中,所有的析构函数都不是虚函数.今天趁着还书的机会到图书馆,还书之后在 TP 分类下闲逛,偶然读到一本游戏编程书,里面说建议将存 ...
- 谈一谈.net析构函数对垃圾回收的影响
之前忘了说了 代码都是在Release模式下运行的,现在补充上. 这里说析构函数,其实并不准确,应该叫Finalize函数,Finalize函数形式上和c++的析构函数很像 ,都是(~ClassNam ...
随机推荐
- .NET书籍推荐
任何语言的学习,要快速掌握,不在看书,而在实践.——题记 .NET技术从1.1发展到2.0,内核基本完善,从.NET 2.0开始学习是个明智的选择.而NET 3.5以及即将推出的.NET 4.0所新加 ...
- 【js】js 让图片旋转
转http://www.cnblogs.com/ustcyc/p/3760116.html 核心: canvas.style.filter = "progid:DXImageTransfo ...
- 在Visual Studio 2010 中创建类库(dll)
创建类库 选择"文件"->新建->项目->Visual C# ->类库,输入名称,选择位置,单击确定 浏览解决方案资源管理器,可以看到两个C#类,第一个是A ...
- Log4Net学习【一】
如果项目上过线的话,那你一定知道Log是多么重要.为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出L ...
- 爬虫组NABC
Need(需求): 我们小组的研究课题是编写一个更实用的爬虫软件,编写时会应用到学长的部分代码并在其基础上完善创新. 鉴于学长代码已经实现了基本功能,即从网站上面爬取相关的Word文档等与计算机有关的 ...
- DB天气app冲刺二阶段第五天
昨天什么事情也没做..看了一场哆啦a梦 所以就不算冲刺了.. 今天主要就是做了一下需要用到的图片的整理还有的就是UI主界面需要展示用的素材,发现好多东西都需要搜索半天,虽然这个不是什么技术活..但真的 ...
- mvc异步表单遇到的问题
1,mvc异步表单遇到的问题 问题:使用jqury easy ui 时提交异步数据不能请求到服务器 解决办法:经过细心调试和检测,发现jqury的加载顺序放在了easy ui之后,所以首先加 ...
- 《Dive into Python》Chapter 4 笔记
自省:Python中万物皆对象,自省是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作.用这种方法,可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用 ...
- 1084: [SCOI2005]最大子矩阵 - BZOJ
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 【最小生成树】BZOJ 1196: [HNOI2006]公路修建问题
1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1435 Solved: 810[Submit][Sta ...