析构函数的特点:
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++:析构函数的更多相关文章

  1. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  2. 【C#】析构函数

    MSDN paper 析构函数 析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数. 析构函数往往用来做“清理善后” 的工作( ...

  3. c++虚析构函数

    虚析构函数的作用主要是当通过基类指针删除派生类对象时,调用派生类的析构函数(如果没有将不会调用派生类析构函数) #include <iostream> using namespace st ...

  4. 转:Delphi2010新发现-类的构造和析构函数功能

    Delphi2010发布了. 虽然凭着对Delphi的热爱第一时间就安装了,但是现在可能是年纪大了,对新事物缺乏兴趣了.一直都没有仔细研究. 今天有点时间试了一下新功能. 本来C#和Delphi.NE ...

  5. c++单例模式为什么不在析构函数中释放静态的单例对象(转)

    需要清楚一下几点:   1.单例中的 new 的对象需要delete释放.   2.delete释放对象的时候才会调用对象的析构函数.   3.如果在析构函数里调用delete,那么程序结束时,根本进 ...

  6. C++构造函数/析构函数 设置成private的原因

    C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...

  7. 关于GC和析构函数的一个趣题

    这个有趣的问题感谢装配脑袋友情提供. 请看如下代码: public class Dummy { public static Dummy Instance; ; ~Dummy() { Instance ...

  8. C++构造函数和析构函数

    构造函数简介 在上一个章节我们在创建好类的对象之后,首先对它的每一个成员属性赋值之后再对它们进行输出操作,如果不赋值就输出,这些值就会是垃圾值.而为了代码的简介,一次性为所有成员属性初始化,C++的类 ...

  9. virtual 修饰符与继承对析构函数的影响(C++)

    以前,知道了虚函数表的低效性之后,一直尽量避免使用之.所以,在最近的工程中,所有的析构函数都不是虚函数.今天趁着还书的机会到图书馆,还书之后在 TP 分类下闲逛,偶然读到一本游戏编程书,里面说建议将存 ...

  10. 谈一谈.net析构函数对垃圾回收的影响

    之前忘了说了 代码都是在Release模式下运行的,现在补充上. 这里说析构函数,其实并不准确,应该叫Finalize函数,Finalize函数形式上和c++的析构函数很像 ,都是(~ClassNam ...

随机推荐

  1. Lucene 3.0

    http://www.cnblogs.com/forfuture1978/archive/2010/02/22/1671487.html http://www.cnblogs.com/jiekzou/ ...

  2. Elastix 禁用SSL(https),还原为 http 访问

    1.相关配置文件目录: Apache的配置文件:httpd.conf,位于:/etc/httpd/conf/httpd.conf,配置文件中包含 Include conf.d/*.conf ,引入了  ...

  3. 修改linux命令行提示符

    安装了ubuntu1304版本,发现命令行@后面的名称太长,影响视觉美观,决定修改一下.修改当前用户目录下面的.bashrc文件即可达到目的. 打开.bashrc文件,找到下面的内容:if [ &qu ...

  4. Selenium-RC Python 2.7 环境配置

    1.下载并安装Python http://www.python.org/getit/,我使用的是2.7.3的python版本 2.下载并安装setuptools[这个工具是python的基础包工具] ...

  5. Tmall Programmer Triples Smartisan Sales

    页面程序造假,丢脸丢到华尔街日报去咯 http://blogs.wsj.com/chinarealtime/2014/10/13/tmall-programmer-triples-smartisan- ...

  6. ERROR 23 (HY000) at line 29963: Out of resources when opening file

    在还原数据库时报错,报错信息如下:(库中的表比较多) ERROR 23 (HY000) at line 29963: Out of resources when opening file 解决方法: ...

  7. OpenWRT 路由配置技巧

    随着最近 Google 在国内已经完全无法访问,使得通过 VPN 访问网络的需求更加强烈,本文介绍的方法可以使一个普通的路由具备稳定连接 VPN 的能力,并能够根据目标访问网站选择国内外线路,从而得到 ...

  8. Ios拦截手机短信程序

    引用 1.手机要越狱,没有越狱的话,下面的可以不用看了!  2.IOS 要5.0以上,4.xx的同上  首先,声明下!由于公司移动开发的项目中,需要根据手机的内容进行逻辑处理,也就是要实现手机短信拦截 ...

  9. [System.Net]模拟Web请求编写简易单词查询客户端

    demo: 我就不上传了 前言 在实际生活中,网络请求的应用极其常见,比如使用浏览器,程序中我们还要调用webservice.那么浏览器是怎么请求网络资源的呢?不用它可以自己请求不? 答案是可以的. ...

  10. ECSHOP模糊分词搜索和商品列表关键字飘红功能

    ECSHOP联想下拉框 1.修改page_header.lbi模版文件,将搜索文本框修改为: <input name="keywords" type="text&q ...