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 0;
}

说明:
(1)每个类必须有一个析构函数。若没有显式的为一个类定义析构函数,则编译系统
会自动生成一个默认的析构函数。例如,编译系统为类Complex生成类似如下述形式的默认
析构函数:Complex::~Complex(){}
类似于系统自动生成的默认构造函数,这个自动生成的默认析构函数的函数体也是空的,但是
它能完成释放对象所占的内存空间的任务。
对于大多数类而言,这个默认析构函数就能满足要求。但是,如果在一个对象撤销之前
需求完成另外一些处理工作的话,则应该显示地定义析构函数,例如:

class String_data{
 public:
       String_data(char *s)  //构造函数 
       {
         str = new char[strlen(s)+1]; //用运算符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)+1]; //用运算符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 0;
}                    

 

转载于:https://www.cnblogs.com/XYQ-208910/p/4912118.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值