析构函数的特点:
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. Asp.net MVC Global.asax文件

    global.asax文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 ...

  2. python autopy

    今天学习了python autopy 主要包括alert,color,mouse,key,bitmap,screen等的操作 文档在http://www.autopy.org/documentatio ...

  3. LAMP开发之环境搭建(2014.12.7在ubuntu下)

    Ubuntu下搭建LAMP环境 前言:学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我搭建的是LAMP环境,即Linux.Apache ...

  4. 浅谈 WPF布局

    我们首先来了解一下图形化用户界面(Graphic User Interface)也就是我们常常听到的GUI.举个简单的例子,同样是数据,我们可以用控制台程序加格式控制符等输出,但是这些都不如GUI来的 ...

  5. 表达式语言之ongl表达式

    OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方 ...

  6. 我的cnblogs设置代码

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. 一点关于Ajax和一个等待图标的显示

    一点关于Ajax和一个等待图标的显示 1.首先Ajax是asynchronous Java-Script and XML的简写.翻译过来就是异步的JS和XML. 2它的优点就是能不更新页面的情况下,得 ...

  8. [转载]非常完善的Log4net详细说明

    前言 此篇文章是我见过写得最好的一片关于Log4Net的文章,内容由简入难,而且面面俱到,堪称入门和精通的佳作,特从懒惰的肥兔的转载过来. 1.概述 log4net是.Net下一个非常优秀的开源日志记 ...

  9. MySQL数据库双机热备份

    MySQL数据库双机热备份 1.mysql 数据库没有增量备份的机制 当数据量太大的时候备份是一个很大的问题.还好 mysql 数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备 ...

  10. Microsoft SQLServer有四种系统数据库

    Microsoft SQLServer有四种系统数据库: 1.master数据库 master数据库记录SQLServer系统的所有系统级别信息.它记录所有的登录帐户和系统配置设置.master数据库 ...