当前位置: 首页 > news >正文

什么是构造函数和析构函数?

1.构造函数

1.1概念

       构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。

1.2 C++构造函数

        C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。   

1.3 C++的构造函数定义格式为:

​class <类名>
{
public:
<类名>(参数表);
//...(还可以声明其它成员函数)
};

<类名>::<函数名>(参数表)
{
//函数体
}
​

如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:

1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;

2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);

3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。

<类名>::<类名>(){},即不执行任何操作。

2.析构函数

         析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

       与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

2.1 函数定义

C++当中的析构函数格式如下:

class <类名>
{
     public:
       ~<类名>();
};
<类名>::~<类名>()
{
    //函数体
}

如以下定义是合法的:

class T
{
   public:
    ~T();
};
T::~T()
{
    //函数体
}

当程序中没有析构函数时,系统会自动生成以下析构函数:

<类名>::~<类名>(){},即不执行任何操作。

注:

构造:将物质(内存)放入,形成一个构造体。

析构:将物质(内存)析取,形成原始状态。

转自:什么是构造函数和析构函数?_吃饭饭想凡凡的博客-CSDN博客_构造函数和析构函数

相关文章:

  • CD-ROM
  • 光盘文件格式-udf、iso9660、Joliet、Romeo
  • 刻录光盘的程序步骤
  • ISO文件
  • DVD-数字通用光盘
  • VCD-影音光碟
  • CD-CompactDisk
  • 光盘的标准与格式
  • Hash-散列函数
  • 索引(index)是什么
  • QT 中文乱码解决汇总(包括QString与string、char*互转乱码)
  • c++中const的作用
  • C++ const 详解
  • QT之QML
  • QNX是什么
  • JavaScript-如何实现克隆(clone)函数
  • C语言笔记(第一章:C语言编程)
  • DataBase in Android
  • JavaScript实现分页效果
  • JDK 6和JDK 7中的substring()方法
  • Laravel 实践之路: 数据库迁移与数据填充
  • Python 基础起步 (十) 什么叫函数?
  • 简单实现一个textarea自适应高度
  • 盘点那些不知名却常用的 Git 操作
  • 悄悄地说一个bug
  • 人脸识别最新开发经验demo
  • 如何学习JavaEE,项目又该如何做?
  • 使用API自动生成工具优化前端工作流
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 我建了一个叫Hello World的项目
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​io --- 处理流的核心工具​
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #android不同版本废弃api,新api。
  • (C语言)fread与fwrite详解
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (备忘)Java Map 遍历
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)windows配置JDK环境
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转载)OpenStack Hacker养成指南
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • **CI中自动类加载的用法总结
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @EnableAsync和@Async开始异步任务支持
  • @selector(..)警告提示
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [20150707]外部表与rowid.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯