C++析构函数和构造函数

一、构造函数


1.构造函数的基本概念

1.对构造函数的理解:

构造函数是类的一种特殊成员函数,其主要功能是在创建对象时进行初始化操作。它的名字与类名相同,并且没有返回值类型(不能是void)。例如,对于一个名为Rectangle的类,其构造函数可以写成Rectangle()或者Rectangle(int width, int height)等形式。

2.构造函数的调用:

每当创建一个类的对象时,相应的构造函数就会被自动调用。这是 C++ 中对象初始化的重要机制。例如:

     class Rectangle {public:int width;int height;Rectangle() {width = 0;height = 0;}};int main() {Rectangle rect;// 此时会自动调用Rectangle类的默认构造函数return 0;}

2.构造函数的类型

1.默认构造函数

1.定义:

如果一个类没有定义任何构造函数,编译器会自动为这个类生成一个默认构造函数。这个默认构造函数会对对象的基本类型成员进行默认初始化(对于内置类型,如intfloat等,其值是未定义的;对于类类型成员,会调用其自身的默认构造函数)。

2.自定义默认构造函数:

可以自己定义默认构造函数来明确对象的初始状态。例如:

       class Point {public:int x;int y;Point() : x(0), y(0) {}};

在这个Point类中,自定义的默认构造函数将xy都初始化为 0。


2.带参数的构造函数

1.定义:

这种构造函数接受参数,用于根据传入的参数值来初始化对象的成员变量。例如:

       class Circle {public:double radius;Circle(double r) : radius(r) {}};

 在这个Circle类中,构造函数Circle(double r)接受一个double类型的参数r,并将其赋值给成员变量radius,从而实现根据传入的半径值初始化Circle对象。

3.拷贝构造函数

1.定义:

用于通过一个已存在的同类型对象来初始化新的对象。它的形式通常是类名(const 类名& 源对象)。例如:

class String 
{public:char* data;String(const String& other) {// 假设这里有合理的内存分配和字符串复制操作int length = strlen(other.data);data = new char[length + 1];strcpy(data, other.data);}
};

当执行String str1; String str2 = str1;这样的操作时,就会调用拷贝构造函数,将str1的内容复制到str2中。注意,这里只是一个简单示例,实际的字符串类还需要考虑内存管理等诸多细节。

2.构造函数的初始化列表
1.定义:

构造函数初始化列表是在构造函数的参数列表和函数体之间,以冒号开始的一系列成员初始化操作。例如:

class Complex 
{public:double real;double imag;Complex(double r, double i) : real(r), imag(i) {}};
2.优势:

使用初始化列表初始化成员变量通常比在构造函数体内赋值更高效。这是因为对于某些类型(如const成员变量和引用成员变量),只能通过初始化列表进行初始化。例如:

class ConstExample 
{public:const int value;ConstExample(int v) : value(v) {}
};

在这个ConstExample类中,value是一个const成员变量,必须通过初始化列表进行初始化,因为const成员变量一旦初始化后就不能再被赋值。

4.委托构造函数

1.定义:

委托构造函数是 C++ 11 引入的特性,它允许一个构造函数调用同一个类中的另一个构造函数,以避免代码重复。例如:

class Shape {public:int sides;Shape(int s) : sides(s) {}Shape() : Shape(0) {}
};

在这个Shape类中,默认构造函数Shape()委托给带参数的构造函数Shape(int s),将sides初始化为 0。


5. 转换构造函数

1.定义:

转换构造函数是一种特殊的单参数构造函数,它可以将参数类型隐式或显式地转换为类类型。例如:

class Temperature
{public:double value;Temperature(double v) : value(v) {}
};int main() 
{double tempValue = 25.0;Temperature temp(tempValue);// 或者可以隐式转换(如果允许)Temperature temp2 = 30.0;return 0;
}

在这个Temperature类中,构造函数Temperature(double v)可以将double类型的值转换为Temperature类的对象,既可以像Temperature temp(tempValue)这样显式转换,也可以在允许隐式转换的情况下像Temperature temp2 = 30.0这样使用。不过,过度使用隐式转换可能会导致代码的可读性和可维护性变差,需要谨慎使用。


二、析构函数(目前我觉得理解到这部分其实已经够了)

  • 析构函数是类的一种特殊成员函数,它的名字是在类名前面加上 “~” 符号。析构函数没有参数,也没有返回值类型。例如,对于类MyClass,其析构函数为~MyClass()
  • 析构函数的主要作用是在对象销毁时执行清理操作,比如释放对象在生命周期内动态分配的内存、关闭文件、释放网络连接等资源。
  • 当对象的生命周期结束时,析构函数会自动被调用。
    • 例如,对于局部对象,当它所在的函数执行完毕返回时,对象的析构函数就会被调用;
    • 对于通过new创建的动态对象,当使用delete删除该对象时,析构函数会被调用。
#include<string>
#include<iostream>
using namespace std;
class Student
{public:Student(int n,string nam,string s)//定义有参的构造偶函数{num = n;name = nam;sex = s;cout << "构造函数被调用" << endl;//输出有关信息	} ~Student(){cout << "析构函数被调用" << endl;//输出有关信息 }void display(){cout << "num:" << num << endl;cout << "name:" << name << endl;cout << "sex:" << sex << endl << endl;}private:int num;string name;string sex;
};int main()
{Student stud1(10010,"张三","男");//建立对象stu1stud1.display();Student stud2(10011,"李华","女");//建立对象stu2stud2.display(); return 0;
}

程序运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/36347.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Cherno C++学习笔记 P32 字符串

这篇文章我们来讲字符串。字符串可以说是最重要的变量类型了&#xff0c;因为对字符串的读写极大地影响到我们的程序和用户之间的交互。甚至很多很庞大的程序就只是在处理字符串。 对于字符串&#xff0c;我们同时需要有关于数组和指针的关系&#xff0c;字符串的实现与数组是…

linuxCNC(五)HAL驱动的指令介绍

HAL驱动的构成 指令举例详解 从终端进入到HAL命令行&#xff0c;执行halrun&#xff0c;即可进入halcmd命令行 # halrun指令描述oadrt加载comoonent&#xff0c;loadrt threads name1 period1创建新线程loadusr halmeter加载万用表UI界面loadusr halscope加载示波器UI界面sho…

在做题中学习(78):数组中第K个最大元素

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决topK问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogN) 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#xff0c;随机选择基准…

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了&#xff0c;也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是…

MySQL 服务无法启动

常见原因: 检查端口占用&#xff1a; 使用命令行工具&#xff08;如netstat&#xff09;来检查3306端口是否已被其他程序占用,输入netstat -ano&#xff08;Windows&#xff09;或netstat -tulnp | grep 3306&#xff08;Linux/Mac&#xff09;来查找3306端口的占用情况。如果…

基于Node.js的后端服务基础模块及应用

使用generator-express-no-stress-typescript脚手架工具创建一个图片上传服务的模板工程&#xff0c;执行如下指令&#xff1a; npm config set registry https://registry.npmmirror.com yo express-no-stress-typescript uploadService 可以看到后端框架如下&#xff1a; 先…

Hadoop生态圈框架部署 伪集群版(八)- Sqoop安装与配置

文章目录 前言一、Sqoop安装与配置&#xff08;手动安装配置&#xff09;1. 下载Sqoop2. 解压Sqoop安装包2.1 解压2.2 重命名 3. 配置Sqoop3.1 配置Sqoop环境变量3.2 修改 sqoop-env.sh 配置文件3.3 配置jar包3.3.1 配置MySQL驱动jar包3.3.2 配置commons-lang-2.6.jar包 4. 测试…

视频编辑技术:一键生成混剪视频的AI技术应用

随着视频内容的爆炸式增长&#xff0c;视频编辑技术也在不断进步。本文将探讨如何利用AI技术&#xff0c;实现一键生成混剪视频&#xff0c;并自动添加配音和字幕&#xff0c;以提高视频编辑的效率和质量。 AI技术在视频编辑中的应用 AI技术在视频编辑领域的应用越来越广泛&am…

笔记本外接显示屏没声音

1、笔记本正常有声音&#xff0c;但是外接显示屏后没有声音了怎么回事呢&#xff1f;原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出&#xff0c;但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法&#xff1a;打开笔记本设置&#xff0c;选择声…

Linux其二设置端口号,静态ip以及命令

目录 1、VI编辑器 【linux版本的文本文件】 2&#xff09; 补充的vi编辑器的其他内容(了解) 2、ln 连接的意思 link的缩写 3、文件的查看 【重点】 4、压缩与解压&#xff08;重点&#xff09; 5、find 查找命令 6、which & whereis 作用是一样的&#xff0c;表示某…

飞飞5.4游戏源码(客户端+服务端+工具完整源代码+5.3fix+5.4patch+数据库可编译进游戏)

飞飞5.4游戏源码&#xff08;客户端服务端工具完整源代码5.3fix5.4patch数据库可编译进游戏&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】飞飞5.4游戏源码&#xff08;客户端服务端工具完整源代码5.3fix5.4patch数据库可编译进游戏&#xff09; 链…

【Linux】进程间通信 -- System V 消息队列

前言 上节Linux学习&#xff0c;我们学习了System V的共享内存&#xff0c;本节我们学习System V 的另一种通信方式 — 消息队列 文章目录 前言一. 消息队列的原理二.创建消息队列二. 查看消息队列三. 删除消息队列四. 读写数据结束语 一. 消息队列的原理 消息队列的本质同共享…

Elasticsearch入门之HTTP基础操作

RESTful REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是&#xff0c;客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在…

4.模块化技术之子程序

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 ​编辑 1.模块化基础和概述 使用模块化有什么好处 两大类模块化技术 程序局部的模块化 SAP系统内全局模块化 封装有什么好处&#xff1f; 2.子程序模块化 三种传递类型 子程序结构…

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的程…

网上图书购物管理系统|Java|SSM|VUE| 前后端分离

【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、M…

Python酷库之旅-第三方库Pandas(264)

目录 一、用法精讲 1251、pandas.tseries.offsets.WeekOfMonth.is_year_end方法 1251-1、语法 1251-2、参数 1251-3、功能 1251-4、返回值 1251-5、说明 1251-6、用法 1251-6-1、数据准备 1251-6-2、代码示例 1251-6-3、结果输出 1252、pandas.tseries.offsets.Las…

“为您的家电穿上防震铠甲:优质电器缓冲器

在地震频发地区或日常生活中&#xff0c;确保家电的安全和稳定至关重要。为了防止地震、意外碰撞或其他外力对家电造成损害&#xff0c;采用优质的电器缓冲器就像是为家电穿上了一层坚固的“防震铠甲”。这不仅能够有效减少因震动导致的损坏风险&#xff0c;还能显著延长家电的…

全连接层与链式求导法则在神经网络中的应用

目录 ​编辑 引言 全连接层的工作原理 前向传播 反向传播 链式求导法则及其在神经网络中的应用 链式求导法则 应用于全连接层 计算梯度 结论 引言 在深度学习领域&#xff0c;全连接层&#xff08;Fully Connected Layer&#xff0c;FC&#xff09;和链式求导法则是…