[ C++ ] C++ 类和对象 -- 类的六个默认成员函数

news2024/11/19 4:43:38

目录

1.构造函数

2.析构函数

3.拷贝构造函数

4.赋值操作符重载

5.两个取地址操作符的重载


在C++中当你创建一个空类,那这个空类是什么都没有吗?不是的,编译器会默认帮你生成六个成员函数

1.构造函数

构造函数是特殊的成员函数,虽然名称是构造,但不是参与对象的创建,而是完成对对象内成员变量的初始化,构造函数有以下特点:

  • 构造函数和类名相同
  • 没有返回值
  • 构造函数可以重载
  • 对象实例化时自动调用构造函数

构造函数完成在类对象创建时由编译器自动调用,保证每个成员都有一个合适的初始值,保证在对象生命周期内只完成一次初始化

class A
{
public:
//无参的构造函数
	A()
	{

	}
private:
	int _a;
};

构造函数可以重载,根据参数的不同实现不同的构造函数

默认构造函数只有三种:

  •         1.我们不写编译器默认生成的构造函数
  •         2.无参的构造函数
  •         3.全缺省的构造函数

类对象中默认构造函数只能有一个,有多个会报错,编译器无法识别要调用哪一个构造函数

class A
{
public:
	A()
	{}
	A(int a = 1)
	{
		_a = a;
	}
private:
	int _a;
};
int main()
{
	A a1;
	return 0;
}

当创建一个类对象,不传参就会调用默认构造函数,可是有两个默认构造函数,这样编译器就无法识别要调用哪一个 

默认构造函数对内置类型不做处理,对自定义类型会去调用自定义类型的默认构造函数

class B
{
public:
	B(int b = 1)
	{
		_b = b;
	}
private:
	int _b;
};
class A
{
public:
private:
	int _a;
	B _b;
};
int main()
{
	A a1;
	return 0;
}

而当B中没有默认构造函数时,A中又没有显示调用B的构造函数时,创建A对象就会报错

2.析构函数

析构函数也是特殊的成员函数,完成的是对象销毁时类内成员变量的清理工作

  • 析构函数跟类名相同,函数名前加上~
  • 没有返回值和参数
  • 对象内有且只有一个析构函数
  • 在对象生命周期结束时自动调用析构函数
class A
{
public:
	~A(){}//析构函数
private:
	int _a;
	B _b;
};

当你没有显示定义析构函数时,编译器会给你默认生成一个析构函数。

对内置类型不做处理,对自定义类型去调用它的析构函数

析构函数不管你是显示写的还是编译器默认生成的,它都会去调用自定义类型的析构函数

当对象内有成员变量有在堆上申请空间时,则需要我们显示写析构函数去进行释放。

而对于自定义类型则会调用它的析构函数

如果成员变量在堆上申请了空间而没有调用析构函数清理则就会内存泄漏

 函数运行时创建对象,实际是在函数的栈帧中存放,而结合栈后入先出的特性,后构造的会先析构。

3.拷贝构造函数

拷贝构造函数,第一个参数是类类型对象的引用(一般用const修饰),在用一个已存在的对象创建新对象时 编译器会自动调用

  • 拷贝构造函数是构造函数的一种重载
  • 第一个参数是类类型的引用

编译器默认生成的拷贝构造对内置类型做值拷贝,对自定义类型会去调用自定义类型的拷贝构造

但这里的值拷贝只是把原对象变量的值按照字节一个个拷贝给新对象,当有指针变量时,就会出现两个对象中的指针成员变量存放的是一样的地址,这样在使用和销毁时就会出现问题。

销毁时调用析构函数,两个对象那就是两次析构,也就是说会对指针变量进行两次析构,从而程序崩溃

这里就需要显示的定义拷贝构造从而进行深拷贝

需要重新申请空间,然后再进行值拷贝 

需要注意的是,拷贝构造的第一个参数只能是类类型对象的引用,因为当是类类型对象时,就会发生无穷递归。

A(A a){}//不带引用的拷贝构造

在C++中规定,当自定义类型传参时使用形参传参时,会去调用本类型对象的拷贝构造构造一个临时对象给形参。而你传参时调用的本类型对象的拷贝构造又需要传参,你又传的是形参,这时就会一直传参发生拷贝构造,而拷贝构造又是类类型对象接收,就又会发生拷贝构造

4.赋值操作符重载

赋值运算符重载需要用到关键字operator,运算符重载函数有返回值和参数,运算符是几元的就有几个参数,C++规定运算符重载不可以改变运算符本来的逻辑,不可创建不存在的运算符进行重载

Date& operator=(const Date& d)
{
    //赋值
}

以下五个运算符不可重载:

        .*         sizeof           .           ?:               ::

而赋值运算符=的重载我们不显示实现,编译器也会默认给我们生成一个,默认生成的赋值重载对内置类型完成值拷贝,对自定义类型会去调用它的赋值运算符重载。 

这里就会遇到和拷贝构造相同的问题,编译器默认生成的赋值运算符重载仅仅只是浅拷贝,而浅拷贝在析构时程序会崩溃,所以这里也一样要进行深拷贝

5.两个取地址操作符的重载

取地址操作符的重载编译器默认生成的就已经够用了,所以这里不过多介绍

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

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

相关文章

使用数据库:

数据库: 1.为何需要数据库? 存储数据方法 第一种:用大脑记住数据, 第二种:写纸上, 第三种:写在计算机的内存中, 第四种:写出磁盘文件 2.数据库能做什么&#xff1…

【探索艺术新纪元:Midjourney中文版,让创意无界!】

🎨 艺术,从此触手可及 在这个数字时代,Midjourney中文版正引领一场艺术创作的革命。作为一款前沿的AI绘画工具,它利用深度学习技术,将你的想象转化为触手可及的艺术作品。无需深厚的绘画功底,只需简单的文…

机器学习:opencv--图像拼接

目录 前言 一、两个函数 1.显示图像 2.计算图片特征与描述符 二、代码实例 1.准备图像 2.特征检测 3.特征匹配 4.图像变换 5.图像融合 前言 图像拼接是一种将多张图像合成一幅大图的技术,常用于全景图生成、图像拼接和图像合成等应用场景。 一、两个函数…

第二十三天|回溯算法| 39. 组合总和,40. 组合总和II,131. 分割回文串

目录 39. 组合总和 未剪枝 剪枝优化 40. 组合总和II 131. 分割回文串 回溯 回溯动态规划优化回文串判断 今天的题目自己都没啥思路,二刷的时候再理解一下。尤其是131. 39. 组合总和 本题和77.组合 ,216.组合总和III的区别是:本题没有…

IDEA 输入英文字体变了的问题

**问题:**有时不知道按了什么快捷键导致在 IDEA 输入英文字体变了,如下所示,看起来特别不顺眼: 出现以上问题是因为在输入时切换了中文输入法,并且在提示文字时按了 Shift 空格 键,导致出现以上字体变化情…

H、Happy Number(2024牛客国庆集训派对day7)

题目链接: H-Happy Number_2024牛客国庆集训派对day7 (nowcoder.com) 题目描述: 翻译为中文: 数据范围: 输入样例: 680 输出样例: 326623 分析: 本来以为是dfs,但是看到数据范围1e9, 联想到是…

uniapp自定义导航,全端兼容

我们在用uniapp 开发应用的时候,有的页面需要自定义导航, 1.如果普通的直接使用uni 扩展柜组件的 uni-nav-bar 也基本够用, 2.如果稍微带点自定义的这个值无法支持的,特别在小程序端,胶囊是会压住右边的按钮的 自定…

多模态简单了解

多模态 1.文本编码2. ViT图像编码器2.1图像矩阵self-attention计算: 3.Transformer多模态3.1CLIP 图文交互3.2 对比学习训练3.3 flamingo 图文交互3.4 LLava 图文交互 1.文本编码 简介: 即通过embedding将字符向量化,进入模型即可。 2. ViT…

水下图像增强(论文复现)

本文所涉及所有资源均在 传知代码平台 可获取。 目录 概述 一、论文思路 二、模型介绍: 三、实现方法 四、复现过程(重要) 部署方式 概述 2021年11月,提出一种用于水下图像增强的U型Transformer模型,这是首次在水下图像增强任务中使用Transfo…

InnoDB 磁盘结构 - RedoLog

文章目录 RedoLog是什么刷盘机制崩溃恢复相关参数Redo Log 和 Undo Log 对比 https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html RedoLog是什么 RedoLog 是MySQL的一种日志文件,用于在崩溃恢复期间纠正由不完整事务写入的数据。在正常操作过程中&…

AtCoder Beginner Contest 374

C - Separated Lunch 题目&#xff1a; 思路&#xff1a; dfs枚举每个数是否选入a数组中&#xff0c;求和比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long LL;const int N25;int a[N]; bool st[N]; int mn0x3f3f3f3f; int sum; …

VMWare安装ubuntu22虚拟机

1.下载VMware虚拟机和ubuntu 下载地址&#xff1a; VMware Workstation Pro - Download (softonic.com) Download Ubuntu Desktop | Ubuntu 2.Ubuntu的安装 1.VMware创建虚拟机。 2.选择默认即可点击下一步。 3.找到刚才下载的ubuntu20.04。选择下面的稍后安装操作系统。 …

众智OA办公系统 Account/Login SQL注入漏洞复现

0x01 产品简介 众智OA办公系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台。它凭借先进的技术和人性化的设计理念,实现了信息的快速传递和自动化处理,帮助企业和机构实现信息化、自动化、智能化和标准化的办公管理。 0x02 漏洞概述 众智OA办公系统 Acc…

【命令操作】linux上watch命令详解 _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【命令操作】linux上basename和dirname使用详解 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于Linux上watch命令的详解文章。watch命令是Linux系统中非常有用的一个工具&#xff0c;它可以定期执行指定的命令并在终端…

解决vscode cpptools-srv.exe占用内存过大,导致系统卡死问题

cpptools-srv.exe是安装了c扩展出来的进程。最新版本c扩展cpptools-srv.exe疯狂的占用内存&#xff0c;笔者机器64G内存 都被占满了&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c; 网上也试了一些其他的办法&#xff0c;设置里面限制内存不过不好…

一入递归深似海,算法之美无止境

最近在刷leetcode hot100,在写二叉树中最大路径和的时候,看到了一个佬对递归的理解,深受启发,感觉自己对于递归的题又行了!!! 这里给大家分享一下(建立大家先去尝试一下这道题再来看 124. 二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每…

【优选算法】--- 位运算

位运算 一、常见的位运算总结&#xff08;重点&#xff01;&#xff09;1、关于位运算的符号2、&#xff08;判断&#xff09;给一个数字n&#xff0c;确定它的二进制表示中的第X位&#xff0c;是1还是0&#xff1f;3、&#xff08;修改&#xff09;如何把一个二进制的数字的第…

算法:双指针系列(一)

双指针系列 一、移动零&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示二、复写零&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示三、快乐数&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示&#xff08…

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式&#xff1a;单机部署与分布式部署&#xff0c;同时支持从单机平滑扩展至分布式架构。这样&#xff0c;可以有效解决小型业务向大型业务转型时面临的扩展难题&#xff0c;降低了机器资源的成本。 以下将详述如何通过命令行&#xff0c;实现集…

Matlab数据预处理——最小二乘法消除多项式趋势项

关注公众号“电击小子程高兴的MATLAB小屋”获取专属优惠 概要&#xff1a; 最小二乘法是一种常用的统计方法&#xff0c;用于通过拟合数据来消除多项式趋势项。以下是关于如何使用最小二乘法消除多项式趋势项的步骤和概念&#xff1a; 概念&#xff1a; 多项式趋势项&#…