C++ 类和对象 (中)

默认成员函数:

C++环境下每一个类在定义是时编译器会自动生成六个成员函数(在没有显示定义的情况下),分别是构造函数、析构函数、拷贝构造函数、赋值运算符重载、普通变量和const常量的取地址重载,它们大大弥补了原先C语言的一些不足,为代码编写者提供了极大的遍历,下面我们来一一解释各个默认成员函数

构造函数:

以栈数据结构为例子,C环境下我们在实例化一个栈结构的时候,必须手动调用初始化函数,但这一步也经常在编写代码的时候忽略,本贾尼先生思来想去想出了一个绝妙的方法,即在实例化类对象的同时让编译器自动调用一个能够给类属性赋初值的成员函数
为了区分与一般成员函数的与众不同,构造函数的形式非常独特,它没有返回值,但不需要再声明定义处前加上void关键字,当不需要传参时调用不需要添加空括号,函数名与类对象名相同。

//栈
class Stack
{
public:Stack(int n=4){_a=(int*)malloc(sizeof(int)*n);_size=0;_capacity=0;}   //显示定义带有缺省值构造函数
private:int *_a;int _size;int _capacity;
};Stack st1;  //不传参调用,写括号编译器分不清是调用还是声明
Stack st1(10);  //传参调用

如果我们显示声明定义了构造函数,那么编译器就不会自动生成,而是执行我们写的,那么如果我们不写的话打印一下三个类属性会出现什么结果呢?
答案是一串随机值,这里可以说是C++的一个缺陷,自动生成的构造函数不会对内置类型作出任何处理,只对自定义类型调用该类型本身的构造函数,举个例子

class Queue
{
public:Queue(){_head=_tail=nullptr;}
private:int* _head;int * _tail;
};
//定义一个Queue对象 q1 充当Stack的类属性

在调试窗口观察四个类属性的值,
在这里插入图片描述
q的值确实被初始化成了空指针(由于编译器版本的原因,可能会将内置类型初始化为0,但这里我们依然认为不对内置类型做处理

C++11在此基础上做了优化,在类属性声明处可以直接给缺省值来实现初始化,具体例子在讲解拷贝构造时给出

析构函数:

C环境下总是要手动调用销毁结构释放空间,同样极易被遗忘,从而在C++环境中衍生出另一个默认成员函数,当类对象生命结束时会自动调用析构函数实现空间释放
与构造函数很像,析构函数也是没有返回值且不需要前缀void的特殊函数,并且它不具有参数,不能重载(构造函数可以重载
为了区分构造函数,析构函数的函数名前有前缀按位取反符 ~

//实现一个栈的析构函数
class Stack{
public://………………~Stack(){free(_a);_a=nullptr;_size=_capacity=0;}//………………
};

同理如果不显示声明定义,编译器会自动生成析构函数并调用

拷贝构造函数:

我们有时候会想要创造一个与一个已有类对象的对象,这个时候我们就需要拷贝,编译器默认的拷贝方式是浅拷贝(值拷贝),即将被拷贝的值逐个字节的传递给拷贝值,这样的方式对于int、char、double这些内置类型是没有问题的,但是对于指针类型或者自定义类型是不行的,原因是因为如果含有指针类型,浅拷贝后会出现两个指针指向同一块空间的情况,这样出现两次析构的时候就会报错,因此这里需要采用深拷贝的方式,C++使用了拷贝构造函数来实现。

拷贝构造函数是构造函数的重载,没有返回值,参数类对象引用,(这里必须通过引用传参,一是能够提升效率,二是如果传值调用会出现无限递归的结果导致程序崩溃,具体图解在后文会给出

class Date//定义日期类
{
public:Date(const Date& d){    //我们不想改变被拷贝值,加const是一个好习惯_year=d._year;_month=d._month;_day=d._day;}
private:_year=2024;_month=1;_day=1;//C++11的特性
};Date d1;
Date d2(d1);//①
Date d2=d1; //②   两种方法是等价的,都是初始化时将d1值拷贝给d2

解释为何不能传值调用:
既定事实:自定义类型的拷贝需要使用拷贝构造
在这里插入图片描述

运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号
函数原型:返回值类型 operator操作符(参数列表)

1、不能通过连接其他符号来创建新的操作符:比如operator@
2、重载操作符必须有一个类类型或者枚举类型的操作数
3、用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
4、作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参
5、**.
、:: 、sizeof 、?: 、.** 注意以上5个运算符不能重载*

以对+运算符的重载为例(Date类)

class Date//定义日期类
{
public:Date& operator+(int year) {_year+=year;return *this;//思考一下为什么传引用返回}
private:_year=2024;_month=1;_day=1;//C++11的特性
};Date d1;
d1+1;//隐式调用
d1.operator+(1);//显示调用

赋值运算符重载:
赋值运算符作为默认成员函数之一,对于类属性只有内置类型的对象可以不需要我们手动编写,编译器会自动生成并调用。

取地址重载:

class Date
{ 
public :Date* operator&(){return this ;}const Date* operator&(){return this ;}
private :int _year ;  int _month ;  int _day ; 
};

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,故不做过多阐述。

……………………………………………………………………………………………………

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

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

相关文章

QT上位机开发(图形绘制)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 图形绘制是上位机软件开发很重要的一个功能。这个图形绘制,有的是离线的,有的是实时绘制的。就我个人而言,离线…

JoySSL怎么样

JoySSL是一家专业的SSL证书服务提供商,致力于为网站和在线业务提供最佳的安全加密解决方案。以下是JoySSL的一些优点: 提供多种类型的SSL证书选择:JoySSL提供单域名、多域名、通配符等不同类型的SSL证书,以满足不同网站的需求。证…

【嵌入式】飞凌嵌入式ELF1开发板 初体验 | 嵌入式Linux开发

文章目录 前言一、开机初体验1.1、开机1.2、连接WIFI 二、基本功能测试2.1、主板命令行测试2.1.1、TF卡热插拔测试2.1.2、LED命令行测试2.1.3、数据库测试 三、基础编程实战3.1、交叉编译链部署3.2、温湿度传感器程序3.3、看门狗程序3.4、六轴传感器程序3.5、MQTT物联网 bug记录…

ROS TF坐标变换 - 动态坐标变换

目录 一、动态坐标变换(C实现)二、动态坐标变换(Python实现) 一、动态坐标变换(C实现) 所谓动态坐标变换,是指两个坐标系之间的相对位置是变化的。比如机械臂末端执行器与 base_link 之间&…

渗透线上下料控制(SCL源代码)

有关渗透线的其它详细介绍请参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/133611151https://rxxw-control.blog.csdn.net/article/details/133611151这里的渗透线上下料属于整个渗透线流程里的最前端和最后端,分别负责待处理…

《Linux系统与网络管理》复习题库---简答题

1、简述这些分区的名字以及各自的作用。 答: /boot 存放内核镜像的地方,这个文件夹独立分区的意义在于降低不能开机的风险。 /根目录,一般采用 ext3 文件系统,分区的容量一定要大于安装软件包的容量。 /usr 多数软件的默认安装的地…

Anaconda3 2021.11安装

1. 镜像下载:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2. 安装在D盘: 3. 配置环境变量: 在这里,第一个教程A在系统变量里配置了五个,但我没有 所以又搜了教程B&#xf…

扎根底层技术,推动机器人换代式升级

热赛道和冷市场的矛盾之下,机器人需要一次换代式升级。 冷中有热的资本市场 在宏观经济下行的影响下,我国服务机器人产量从2022年开始出现明显放缓,2021年12月至2022年12月,我国服务机器人产量都处于同比下滑的状态,…

LeetCode每日一题.05(N皇后)

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种…

以元旦为题的诗词(三)

愿新的一年给我们带来无尽的好运和幸福愿我们的梦想在新的起点绽放! 让我们在未来的日子里书写新的篇章! 接着分享几首以元旦为题的几首诗,喜欢的朋友可以自取,想要更多免费的诗词,请自行百度或小程序搜索:美诗计 元旦 元旦佳节…

剑指“CPU飙高”问题

一、什么是cpu飙高? 一般指程序运行时cpu占用率过高   linux系统中,我们使用top命令,会看到正在运行进程的cpu使用率等,同时在最上面也会看到总的cpu使用率,当总的cpu使用率过高,如果有运维监控平台&…

【Linux】理解文件系统

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 了解磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构1.3 磁盘的存储结构 2. 文件系统2.…

2023年12月编程语言排行榜

TIOBE Index for December 2023 December Headline: C# on its way to become programming language of the year 2023 2023年12月的TIOBE指数&#xff1a;12月头条:c#将成为2023年最佳编程语言 Yes, I know, we have been here before. At the end of 2022, it looked like …

全局异常和自定义异常处理

全局异常GlobalException.java&#xff0c;basePackages&#xff1a;controller层所在的包全路径 import com.guet.score_management_system.common.domian.AjaxResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bi…

电脑怎么设置代理IP上网?如何隐藏自己电脑的真实IP?

在现代互联网中&#xff0c;代理IP已成为许多用户保护隐私和上网安全的重要手段。通过设置代理IP&#xff0c;用户可以隐藏自己的真实IP地址&#xff0c;提高上网的安全性&#xff0c;同时保护个人信息不被泄露。本文将详细介绍如何设置代理IP上网以及如何隐藏电脑的真实IP地址…

Vue Tinymce富文本组件添加自定义字体项

实现效果如下&#xff1a; Tinymce 组件进行字体设置 设置完后&#xff0c;就可以使用自定义的字体了。

Spring Boot整合 EasyExcel 实现复杂 Excel 表格的导入与导出功能

文章目录 1. 简介2. 引入依赖3. 导入功能实现3.1 创建实体类3.2 编写导入 Controller3.3 编写导入页面 4. 导出功能实现4.1 编写导出 Controller4.2 编写导出页面 5. 启动应用 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &…

你好2024!

大家好&#xff0c;我是小悟 2024年1月1日&#xff0c;新年的第一天&#xff0c;阳光明媚&#xff0c;空气中弥漫着希望和新的开始的气息。在这个特别的日子里&#xff0c;大家纷纷走出家门&#xff0c;迎接新年的到来。 街道上&#xff0c;熙熙攘攘的人群中&#xff0c;有孩…

【动态管理日志】Spring Boot 实现 热插拔 AOP,非常实用!

现在有这么一个需求&#xff1a;就是我们日志的开与关是交给使用人员来控制的&#xff0c;而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理&#xff0c;但是如何动态的来实现日志管理呢&#xff1f;aop源码中的实现逻辑中有这么一个步骤&#xff0c;就是会…

将学习自动化测试时的医药管理信息系统项目用idea运行

将学习自动化测试时的医药管理信息系统项目用idea运行 背景 学习自动化测试的时候老师的运行方式是把医药管理信息系统项目打包成war包后再放到tomcat的webapp中去运行&#xff0c;于是我想着用idea运行会方便点&#xff0c;现在记录下步骤方便以后查找最开始没有查阅资料&am…