【c++】构造函数与析构函数

来源:互联网 发布:国家卫生网络信息直报 编辑:程序博客网 时间:2024/04/27 21:29

一、构造函数

C++提供构造函数来处理对象的初始化,构造函数是一种特殊的成员函数,与其他的成员函数不同,不需要用户来调用他,而是在建立对象时自动执行。

它的特点是:函数名和类名相同,没有返回值,可以重载

 

如果程序中未声明,则系统自动产生出一个默认的构造函数,默认的构造函数时不带参数的。比如:Student t;这是就会调用默认的构造函数。在定义对象时指定成员的初始值时,系统不会自动生成一个有参的构造函数,需要自己生成。





由结果可知:全局对象的构造函数优先于main函数执行

 

一、析构函数

析构函数也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名前面加了一个~”符号。

特点:没有参数,没有返回类型,不能被重载,如果没有定义析构函数,编译器会自动生成一个默认的析构函数。

当对象的生命周期结束的时候,会自动调用析构函数,具体来说一下情况会调用:

    1)在函数中定义了一个局部对象,在函数结束时,对象释放会调用析构函数

    2)静态局部对象在函数调用时对象并不释放,因此不调用析构函数,只在main函数结束或者调用exit函数结束程序时,才调用static局部变量的析构函数。

    3)如果定义了一个全局变量,则在程序的流程离开其作用域(在main函数结束或者调用exit函数时),调用该全局的对象的析构函数。

    4)用new运算符动态建立了一个对象,当用delete运算符释放该对象时,先释放该对象的析构函数。

析构函数的作用并不是删除对象,而是在撤销对象占用内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。





由结果可知:析构函数与构造函数的顺序相反。

 

析构函数的显示调用:t.~Test

 

 

一、转换构造函数

特点:单个参数的构造函数

作用:将任意类型转换为类类型,不能默认生成。



Test t = 10; //初始化,带一个参数的构造函数,这里的转换构造函数充当的是普通构造函数的作用。

t = 20;// 1、赋值,调用转换构造函数,将20这个整数转换成类类型,构建了一个临时对象Test(20)2、调用运算符重载,将临时对象赋值给t对象

 

使用explicit关键词,是转换构造函数失效!

一、初始化列表

·const成员的初始化只能在构造函数初始化列表中进行,必须在每个构造函数中初始化

 ·引用成员的初始化也只能在构造函数初始化列表中进行

 ·对象成员(对象所对应的类没有默认构造函数)的初始化,也只能在构造函

   数初始化列表中进行,这里的对象成员是指类里面包含的类的对象成员。

代码示例:

 #include<iostream>using namespace std;class Object{public:      Object(int num = 0):num_(num),knum_(num)      {          cout << "object"<<num_<<"...."<<endl;      }      ~Object()      {          cout<<"~object"<<num_<<"....."<<endl;      }      void DisplayKnum()      {          cout<<"knum = "<<knum_<<endl;        }private:      int num_;      int knum_;};int main(){    Object t;    t.DisplayKnum();}

五、拷贝

#include<iostream>using namespace std;class Object{public:      enum Result      {          success = 1,  fail =  -1      };      Object(int num = 0):num_(num),knum_(num)      {          cout << "object"<<num_<<"...."<<endl;      }      ~Object()      {          cout<<"~object"<<num_<<"....."<<endl;      }      void DisplayKnum()      {          cout<<"knum = "<<knum_<<endl;        }private:      int num_;      int knum_;};int main(){    Object t;    t.DisplayKnum();    cout<<Object::success<<endl;}



 六、拷贝构造函数

功能:使用一个已经存在的对象来初始化一个新的同类型的对象

声明:只有一个参数并且该参数为该类对象的引用

如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员。

 格式:Testconst Test& other

代码例程:









0 0
原创粉丝点击