析构函数的特点:
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. (转载)delphi文件流

    delphi文件流 [复制链接] 在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法. TStream类中定义的属性介绍如下: 1.Size: 此属性以字节返回流中 ...

  2. 【转】微软MVP攻略 (如何成为MVP?一个SQL Server MVP的经验之谈)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 初衷 什么是微软MVP? 成为微软MVP的条件? 如何成为微软MVP? (一) 申请时间划分 (二) 前期准备 (三) ...

  3. Configure Log Shipping

    准备工作 两台装有的Windows Server 2012R2以及SQL Server 2012的服务器 下载评估版 Windows Server 2012 R2 下载 Microsoft SQL S ...

  4. dblink 的源数据表结构修改后在存储过程里执行报错

    原情况:A服务器表A服务器B也有一张表A服务器B上有一个存储过程要把本地的head表向A服务器表里插入数据.变更后:在A服务器表里增加了一个字段inserttime,服务器B存储过程本地表向A服务器插 ...

  5. python之类私有成员

    python类的成员前加双下划线"__", 则被看作"私有"成员. 实例不能简单地通过<instance>.<name>来访问. 但py ...

  6. 非常实用的10个PHP高级应用技巧

    PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML ...

  7. dom4j增删改查

    //dom4j添加内容,在第一本书上指定位置添加售价 更改保存所有孩子list集合的顺序 @Test public void add1() throws Exception{ //读 SAXReade ...

  8. Qt html 界面混合编程

    Qt部分 项目文件.pro Qt += webenginewidgets webchannel 创建WebEngineView #include <QtWebEngineWidgets> ...

  9. jquery插件dataTables添加序号列

    官网方法实例: $(document).ready(function() {     var t = $('#example').DataTable({         "columnDef ...

  10. 1509: [NOI2003]逃学的小孩 - BZOJ

    Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui ...