C++中的构造函数与析造函数详解

所属分类: 软件编程 / C 语言 阅读数: 70
收藏 0 赞 0 分享

C++中的构造函数与析造函数详解

 构造函数的概念

        (1)构造函数是特殊的成员函数
        (2)当创建类类型的新对象时,系统自动会调用构造函数
        (3) 构造函数是为了保证对象的每个数据成员都被正确的初始化。        

        创建构造函数的注意事项:

        (1) 函数名与类名相同;
        (2) 没有返回类型,返回类型也不能是void型
        (3) 构造函数通常情况下声明为public,否则不能像其它成员函数那样被显示的调用
        (4) 构造函数也可以声明为private,但是是用作特殊用途-----如单例类singleton时就是将构造函数声明为private.
        (5) 构造函数可以有任何类型与任意个数的参数,一个类可以定义多个构造函数(重载)

        关于默认构造函数:

        默认构造函数是构造函数的其中一种。除此之外,还有拷贝构造函数与转换构造函数,这个后期再说明。默认构造函数是不带任何参数的构造函数,如果程序中未声明定义任何一个构造函数,则系统将自动产生一个默认的构造函数,此时不会对对象数据成员进行初始化,那么对象数据成员的值将是随机的。而如果我们提供了一个构造函数(只要是构造函数,无论是带参数的,还是不带参数的,是拷贝还是转换构造函数),哪怕只提供了仅仅一个构造函数,系统就不会再为我们提供默认构造函数了。

        下面是关于构造函数的类定义:

class Test 
{ 
public: 
  Test(){} //系统不再提供默认构造函数 
  Test(int val) //构造函数可以重载 
  { 
    val_ = val ; 
  } 
  ~Test(){} 
 
private: 
  int val_; 
}; 

        下面代码是Test类的使用:

int main() 
{ 
  Test t1; //系统调用不带参数的默认构造函数 
  Test t2(5); //系统调用带一个参数的构造函数 
   
  Test *t3 = new Test(20); //分配内存+调用带一个参数的构造函数,这种操作称为new operator. 
 
  delete t3; // 调用析构函数+ 释放内存 
} 

        请注意:全局对象的构造函数是先于main函数执行的       

析构函数概念

        (1) 函数名与类名类似,前面多了一个"~"符号(取反符)
        (2) 没有返回类型
        (3) 不能有参数
        (4) 不能被重载(这个好理解,因为没有参数,自然不能重载)
        (5) 如果没有定义析构函数,则编译器会自动生成一个默认的析构函数,函数体是空的。

 析构函数与对象数组

        把握一个原则,构造几个对象,就要调用几次析构函数。

        拿上面的Test类来进行举例说明:

int main() 
{ 
  Test t[2] = {10,20}; //对象数组初始化,创建2个元素,即2个Test对象,分别传递初始值为10,20,就是说调用的是带一个参数的构造函数。由于创建了2个对象,构造函数也调用了两次 
  Test *t2 = new Test(2); //仅创建一个对象,初始值为2,调用带一个参数的构造函数。 
 
  delete t2; //调用一次析构函数。 
 
  Test *t3 = new Test[2]; //在堆上创建2个对象,无初始值,调用的是不带参数的默认构造函数,由于是2个对象,故调用了2次。 
 
  delete [] t3; //调用两次析构函数,还有释放内存操作。 
} 

        注意:析构函数可以被显式调用,但是当对象的生命周期结束后,系统还会再调用一次析构函数,这样就造成了调用2次析构函数,如果在析构函数中含有delete操作,就会出现问题。所以析构函数的显式调用比较少。STL源码中有用到析构函数的显式调用,这属于一些特殊用法。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多