zoukankan      html  css  js  c++  java
  • 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;
    }                    
  • 相关阅读:
    向量的内积和外积
    软件姿态解算
    PLC与外接按钮开关接线方法图解
    关于三极管处于临界饱和状态的分析
    C语言中的volatile——让我保持原样
    C语言异或运算在程序设计中的妙用
    各种转PDF
    javax.mail发送邮件功能
    MySQL总结
    idea永久破解
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4912118.html
Copyright © 2011-2022 走看看