构造函数和析构函数

来源:互联网 发布:淘宝隐藏券淘客 编辑:程序博客网 时间:2024/06/14 22:29
      类也是用户自定义的一种特殊的数据类型,定义类对象的时候也要进行内存空间的分配和初始化,当特定的对象使用结束后,还需要做些清理和回收存储空间等善后工作,c++的对于类对象的初始化和清理的工作分别由两个特殊的成员函数来完成,就是题目中写的构造函数和析构函数。
     一:构造函数。
     对象创立时电泳,在对象创立的时候由系统自动调用,本身是一种特殊的成员函数。
     ①函数名和类名相同
     ②可以又任意类型的参数,但没有返回值。
     ③不能被显示调用,只有在对象创立的时候自动调用。
     ④类的定义没有自定义构造函数时,系统会默认有一个构造函数:这个函数的功能是啥都不做。     

     所以恰当的构造函数可以在对象被创立的时候获得一个默认值(这个默认值是需要用户输入的,在创建对象时要写入,用于对数据成员赋值)。

#include<iostream>using namespace std;class clock    {private:        int hour;        int min;        int sec;     public:     clock(int h=2,int m=3,int s=4);    //构造函数声明 ,无返回类型,函数名与类名相同                                        //这里也可以使用带默认值函数     void show_time()       //一般成员函数,这里使用内敛成员函数(在类内定义)     {cout<<hour<<":"<<min<<":"<<sec<<endl;     }    };    clock::clock(int h,int m,int s)   //构造函数定义    {        hour=h;        min=m;        sec=s;       }int main(){    clock clk(1,2,5);       //定义的时候就调用构造函数进行初始化 ,    clk.show_time();         //这里是对象名.函数名 ,不要写成类了 。  clk.clock::show_time(),这是完整写法    return 0; }// 理解看来,这样看来,构造函数就是一种特殊的成员函数,当函数名和类名相同时,调用就简化了,这可能是c++的一种简机制吧,用来简化对象的初始化过程。

    
 拷贝构造函数也是用于利用已存在的一个对象对另一个对象的初始化。也是由默认的拷贝构造函数的,是完全复制,如果有特殊需求,比如只复制某些数据,或者要放大某些数据等。则需自定义拷贝构造函数。
      它是一种特殊的构造函数,具有一般构造函数的所有特性,形参是本类的对象的引用。看下面的例子。
#include<iostream>using namespace std;class clock    {private:        int hour;        int min;        int sec;     public:     clock(int h=2,int m=3,int s=4);    //构造函数声明 ,无返回类型,函数名与类名相同                                        //这里也可以使用带默认值函数     clock(clock &p);        //拷贝构造函数声明     void show_time()       //一般成员函数,这里使用内敛成员函数(在类内定义)     {cout<<hour<<":"<<min<<":"<<sec<<endl;     }    };    clock::clock(int h,int m,int s)   //构造函数定义    {        hour=h;        min=m;        sec=s;       }    clock::clock(clock &p)          //拷贝构造函数,这里放大两倍,    {        hour=2*p.hour;        min=2*p.min;        sec=2*p.sec;    }int main(){    clock clk(1,2,5);       //定义的时候就调用构造函数进行初始化 ,    clk.show_time();           clock clk_1(clk);         //利用clk对clk_1进行拷贝构造,放大两倍    clk_1.show_time();         //这里是对象名.函数名 ,不要写成类了    return 0; }
二:析构函数。
     当对象消失后,通常要执行一些清理任务,比如释放内存空间等。析构函数是用于取消对象的成员函数和构造函数的作用恰好相反。
     ①析构函数与构造函数一样,函数名与类名相同,但是前面加~。
     ②析构函数没有参数也没有返回值。且一个类只能有一个析构函数。
     ③当撤销对象时,自动调用析构函数。
     ④不定义时,系统自动生成一个析构函数,作用是不执行任何操作。
#include<iostream>using namespace std;class clock    {private:        int hour;        int min;        int sec;     public:     clock(int h=2,int m=3,int s=4);    //构造函数声明 ,无返回类型,函数名与类名相同                                        //这里也可以使用带默认值函数     clock(clock &p);        //拷贝构造函数声明     void show_time()       //一般成员函数,这里使用内敛成员函数(在类内定义)     {cout<<hour<<":"<<min<<":"<<sec<<endl;     }     ~clock();    //西沟函数声明       };    clock::clock(int h,int m,int s)   //构造函数定义    {        hour=h;        min=m;        sec=s;       }    clock::clock(clock &p)          //拷贝构造函数,这里放大两倍,    {        hour=2*p.hour;        min=2*p.min;        sec=2*p.sec;    }    clock::~clock()    {        if(hour>6&&hour<18)        cout<<hour<<"当前时间是白天"<<endl;        else  cout<<hour<<"当前时间是晚上"<<endl;     }int main(){    clock clk(9,2,5);       //定义的时候就调用构造函数进行初始化 ,    clk.show_time();           clock clk_1(clk);         //利用clk对clk_1进行拷贝构造,放大两倍    clk_1.show_time();         //这里是对象名.函数名 ,不要写成类了    return 0; }

运行结果如上图,但是好像是先释放的clk_1的内存,然后clk的,但是clk结束的早,不清楚到底是个怎样的机制,可能是运行结束后从后往前逐一释放吧,这块也不是很明白。

0 0
原创粉丝点击