【C++】- 类和对象(构造函数!析构函数!拷贝构造函数!详解)

类和对象②

  • 类的6个默认成员函数
  • 构造函数
  • 析构函数
  • 拷贝构造函数

类的6个默认成员函数

上一篇详细介绍了类。如果一个类中什么成员都没有,简称为空类。

在这里插入图片描述那么空类中真的什么都没有吗?

并不是,当类在什么都不写时,编译器会自动生成以下6个默认成员函数:

  • 默认构造函数:如果一个类没有定义任何构造函数,编译器会自动生成一个默认构造函数。默认构造函数不带参数,用来初始化对象的非静态成员变量。
  • 拷贝构造函数:拷贝构造函数用于按值传递参数或以值返回对象时调用,也可以用于复制一个对象到另一个对象。默认的拷贝构造函数将每个成员变量从另一个对象复制到新对象中。
  • 赋值运算符:赋值运算符用于将一个对象的值赋给另一个对象。默认的赋值运算符将每个成员变量从另一个对象复制到当前对象中。
  • 移动构造函数:移动构造函数用于转移对象内存资源的所有权。当使用右值引用时,可以调用移动构造函数。
  • 移动赋值运算符:移动赋值运算符用于将对象内存资源的所有权转移给另一个对象。当使用右值引用时,可以调用移动赋值运算符。
  • 析构函数:析构函数用于在对象被销毁时进行清理工作,如释放动态分配的内存。默认的析构函数不做任何操作

构造函数

在面向对象的编程语言中,构造函数是一种特殊的成员函数,用于创建和初始化对象。构造函数在对象创建时自动调用,并且在对象整个生命周期内只调用一次。负责为对象分配内存并对成员变量进行初始化。

构造函数是一个与类同名的特殊成员函数,没有返回类型,并在对象创建时自动调用。它的作用是初始化对象的数据成员,为对象分配内存空间,并执行其他必要的初始化操作。

在这里插入图片描述构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

每个类都至少有一个构造函数,如果没有显式定义,编译器会自动生成默认构造函数。

看下面一段代码:

#include <iostream>
using namespace std;// 定义一个简单的Person类
class Person {
private:string name;int age;public:// 默认构造函数Person() {name = "Unknown";age = 0;cout << "Default constructor called" << endl;}// 带参数的构造函数Person(string n, int a) {name = n;age = a;cout << "Parameterized constructor called" << endl;}// 打印信息的成员函数void printInfo() {cout << "Name: " << name << endl;cout << "Age: " << age << endl;}
};int main() {// 创建对象并调用默认构造函数Person p1;   // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明p1.printInfo();// 创建对象并调用带参数的构造函数Person p2("Alice", 25);p2.printInfo();return 0;
}

在上述示例代码中,我们定义了一个名为Person的类,该类具有两个构造函数:默认构造函数带参数的构造函数。默认构造函数在对象创建时自动调用,对name和age进行默认初始化,并输出一条相关信息。带参数的构造函数接受两个参数(姓名和年龄),并将其赋值给相应的成员变量,同样输出一条相关信息

所以上面代码的运行结果是:

Default constructor called
Name: Unknown
Age: 0
Parameterized constructor called
Name: Alice
Age: 25

在这里对编译器生成的默认构造函数作说明:
在这里插入图片描述

析构函数

在面向对象的编程中,析构函数是一种特殊类型的函数,用于在对象生命周期结束时执行清理和释放资源的操作。与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

析构函数的作用:

  • 释放资源:析构函数常用于释放对象在生命周期中申请的动态内存、关闭文件或网络连接等资源。
  • 清理操作:析构函数可用于执行对象销毁前需要进行的清理操作。

析构函数的命名和特点:

  1. 析构函数与类名相同,前面加上一个波浪号 ~ 作为标识符。
  2. 析构函数无返回类型,无参数(或者带有默认参数),无返回值类型,且只能有一个析构函数。
  3. 析构函数不能被继承,因此不能被声明为虚函数。
  4. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构
    函数不能重载

析构函数的调用时机:

  • 当对象的生命周期结束时,即对象超出其作用域。
  • 当对象被显式删除(delete)或销毁(destroy)时。
  • 当对象是动态分配的,且所在的内存被释放时。

看下面一段代码

class MyClass {
private:int* ptr;public:MyClass() {ptr = new int;*ptr = 0;}~MyClass() {delete ptr;cout << "Destructor called" << endl;}
};int main() {MyClass obj;// ...return 0;
}

在上述示例代码中,MyClass类的析构函数负责释放动态分配的内存,它会在对象生命周期结束时自动被调用。

1.析构函数应该遵循“先进后出”的原则。即,如果在构造函数中有动态分配的资源,那么在析构函数中应该按相反的顺序释放这些资源。
2.析构函数不应该抛出异常,因为在析构函数中抛出异常会导致程序崩溃。
3.在继承关系中,基类的析构函数应该声明为虚函数,以确保派生类对象能够正确地释放资源。

拷贝构造函数

拷贝构造函数是一个特殊的构造函数,用于创建一个对象并将其初始化为同类对象的副本。当对象被作为参数传递给函数或者通过赋值操作符进行对象之间的赋值时,拷贝构造函数被自动调用。它通常采用引用方式传递对象参数,并且参数必须是const类型,以避免修改原始对象的值。

拷贝构造函数的语法如下:

ClassName(const ClassName& obj);

拷贝构造函数经常的使用场景:

  1. 对象作为函数参数传递:当对象作为函数参数传递时,拷贝构造函数会被调用来创建一个新对象,并将原始对象的值复制到新对象中。这样可以确保函数内部对对象的修改不会影响到原始对象。
  2. 对象作为函数返回值:当函数返回一个对象时,拷贝构造函数用于创建返回值的副本。这样可以避免在函数返回后原始对象被修改导致错误的结果。
  3. 对象之间的赋值操作:当将一个对象赋值给另一个对象时,拷贝构造函数会被调用来创建一个副本。这样可以确保新对象独立于原始对象,修改新对象不会影响到原始对象

拷贝构造函数可以实现两种类型的拷贝:深拷贝浅拷贝.

深拷贝:深拷贝会创建一个新的对象,并将原始对象中的所有成员变量逐个复制到新对象中。这样每个对象都有自己的独立内存空间,修改一个对象不会影响到其他对象。

浅拷贝:浅拷贝只是简单地复制指针,两个对象共享同一块内存空间。这意味着,如果一个对象修改了共享的内存,另一个对象的值也会发生改变。

在拷贝构造函数中,如果成员变量包含指针或动态分配的内存,我们应该采用深拷贝,确保每个对象都有自己的独立内存空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer设置端口,并设置SQLServer和SQLServer Browser服务

SQLServer默认使用动态端口&#xff0c;即每次启动sqlserver.exe时&#xff0c;端口port都会动态变化。若要使用静态端口&#xff0c;比如port1433&#xff0c;则需要在SQL Server Configuration Manager(简称SSMS&#xff09;里配置。这里以SQL Server 2005 Configuration Man…

安科瑞有序充电运营场站落成-安科瑞 蒋静

今年6月&#xff0c;发布了《关于进一步构建高质量充电基础设施体系的指导意见》&#xff0c;提出到2030年基本建成高质量充电基础设施体系&#xff0c;以支撑新能源汽车产业的发展和满足人民群众的出行充电需求。7月底&#xff0c;国家部门印发了《关于促进汽车消费的若干措施…

应对 DevOps 中的技术债务:创新与稳定性的微妙平衡

技术性债务在DevOps到底意味着什么&#xff1f;从本质上讲&#xff0c;这是小的开发缺陷的积累&#xff0c;需要不断地返工。它可能由多种原因引起&#xff0c;例如快速交付新功能的压力&#xff0c;这可能会导致团队不得不牺牲代码的整洁和完善。但这些不完整的小代码&#xf…

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML&#xff1f; QML是一种用户界面规范和编程语言。它允许开发人员…

桌面图标变成白色文件?学会这4个方法,轻松解决!

“不知道为什么&#xff0c;我有些文件夹直接保存在电脑桌面了&#xff0c;但是今天查看的时候却发现它们变成了白色的文件。有什么方法可以解决这个问题吗&#xff1f;” 在使用电脑时&#xff0c;可能由于各种原因&#xff0c;会出现桌面图标变成白色文件的情况。这不仅会让用…

docker安裝gocd-server,并配置gitlab授权登录

gocd的地址&#xff1a;Installing GoCD server on Windows | GoCD User Documentation gocd文档&#xff1a;GitHub - gocd/docker-gocd-server: Docker server image for GoCD 一、docker拉取gocd镜像 #拉取server镜像 docker pull gocd/gocd-server:v21.1.0docker pull g…

isaacgym(legged_gym)学习 (二)—— 设置环境地形

isaacgym(legged_gym)学习 &#xff08;二&#xff09;—— 设置环境地形 文章目录 isaacgym(legged_gym)学习 &#xff08;二&#xff09;—— 设置环境地形前言一、了解isaacgym中地形如何构成的二、自定义修改1.代码2.查看script/play.py 总结 前言 如何设置isaacgym中的环…

系列三十七、IDEA设置全局快捷键

一、IDEA设置全局快捷键 1.1、idea默认的快捷键 1.2、修改全局搜索快捷键为Alt F

永磁同步电机的磁场定向控制

目录 概述 通过系统仿真验证行为 探索模型架构 生成用于集成到嵌入式应用程序的控制器 C 代码 指定控制器模型的参考行为 创建 PIL 实现 准备用于 PIL 测试的控制器模型 测试生成的代码的行为和执行时间 结论 此示例说明从电机控制算法生成 C 代码并验证其编译行为和执…

进程间通信之匿名管道和命名管道的理解和实现【Linux】

进程间通信之匿名管道和命名管道的理解和实现 进程间通信什么是管道匿名管道代码实现管道的读写规则管道特点 命名管道创建命名管道代码实现 进程间通信 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同…

【obj To 3DTiles 格式转换】 可以自定义经纬高、属性表等参数 (一)

目录 0 引言1 3DTiles数据2 objTo3DTiles2.1 工具的安装2.1.1 拓展&#xff1a;Node.js 和 npm 2.2 工具的使用2.2.1 输出成瓦片数据2.2.2 输出带有坐标参数的瓦片数据 3 查看3DTiles数据 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;Cesiumfor…

谷歌DeepMind最新研究:对抗性攻击对人类也有效,人类和AI都会把花瓶认成猫!

人类的神经网络&#xff08;大脑&#xff09;和人工神经网络&#xff08;ANN&#xff09;的关系是什么&#xff1f; 有位老师曾经这样比喻&#xff1a;就像是老鼠和米老鼠的关系。 现实中的神经网络功能强大&#xff0c;但与人类的感知、学习和理解方式完全不同。 比如ANN表…

上海亚商投顾:创业板指再创调整新低 全市场超4700只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数1月5日集体调整&#xff0c;沪指午后跌超1%&#xff0c;创业板指一度跌逾2%&#xff0c;尾盘跌幅有所…

.net 开源混淆器 ConfuserEx

官网&#xff1a;ConfuserEx 下载地址&#xff1a;Releases yck1509/ConfuserEx GitHub 使用参考&#xff1a;https://www.cnblogs.com/zhangzhi19861216/p/3937434.html

Windows10安全中心图标的关闭方法

在Windows10​​​​​​​电脑中&#xff0c;用户可以选择关闭不必要的应用图标。现在&#xff0c;用户想要关掉安全中心图标&#xff0c;但不知道有什么方法能够成功关掉安全中心图标&#xff1f;下面小编给用户们带来Windows10系统安全中心图标的关闭方法步骤&#xff0c;帮…

c语言-库函数qsort()初识

目录 前言一、qsort()的介绍及使用1.1 qsort()的介绍1.2 qsort()的使用1.2.1 使用qsort|()对整型数组按照升序排序1.2.2 使用qsort()对整型数组按照降序排序1.2.3 使用qsort()对结构体数组数据进行排序 二、利用冒泡排序模拟实现对任何数据进行排序2.1 冒泡排序2.2 模仿qsort()…

【REST2SQL】04 REST2SQL第一版Oracle版实现

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 REST2SQL的第一个版本&#xff0c;只支持Oracle数据库&#xff0c;以后会逐步加入其它数据看的支持。 项目文件组织如下&#xff1a; 1 REST2SQL为项目主目录 …

leetcode动态规划问题总结 Python

目录 一、基础理论 二、例题 1. 青蛙跳台阶 2. 解密数字 3. 最长不含重复字符的子字符串 4. 连续子数组的最大和 5. 最长递增子序列 6. 最长回文字符串 7. 机器人路径条数 8. 礼物的最大价值 一、基础理论 动态规划其实是一种空间换时间的基于历史数据的递推算法&…

linux常见操作,and一些练习题加线上练习网站,无须配置linux.持续更新中。。。。

文章目录 cd命令相对路径特殊的路径表达符和cd一起使用pwdmore 查看文件内容支持翻页小技巧clear用户&#xff0c;用户权限 and 用户的切换如何创建用户 ls和通配符的使用利用通配符 *grep 过滤管道符 |如何学习Linux在线练习网站 https://www.lanqiao.cn/courses/1 cd命令 cd…

Basal前端梳理

Basalt前端逻辑梳理 TBB安装参考 https://zhuanlan.zhihu.com/p/480823197 代码注释参考 https://blog.csdn.net/qq_39266065/article/details/106175701#t7 光流追踪参考 https://blog.csdn.net/weixin_41738773/article/details/130282527 VI Odometry KLT tracking 原理 …