【C++课程学习】:类和对象(拷贝构造和运算符重载)

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

✍拷贝构造:

🍉特点一:

🍉特点二:

🍉特点三:

🍉特点四:

拷贝构造函数三种调用场景:

✍运算符重载:

🍭赋值运算符重载:

🍭前置++和后置++的重载:


 

前言:

前面已经学过默认成员函数,但是只讲了构造函数和析构函数。这篇文章就来讲一讲剩下的两个默认成员函数:拷贝构造函数和赋值运算符重载。

拷贝构造函数也是属于构造函数的,只是拷贝构造是用另外一个对象里的数据给新创建的对象赋值。

✍拷贝构造:

拷贝构造:

拷贝构造只有一个和要创建的对象同类型的参数的引用,而且一般用const修饰,因为这个参数只要读取权限就可以了。因为他属于构造函数,所以我们传参时满足这一特点,编译器就会调用这个构造函数。

🍉特点一:

拷贝构造是构造函数的一种重载形式。


🍉特点二:

拷贝构造的参数只有一个,并且一定要是同类型的对象的引用。

比如:

Data (const Data& d){

        ……

}


🍉特点三:

如果是传值拷贝构造,那么就会发生无穷递归。

看看下面的错误示范:

#include<iostream>
using namespace std;

class Data {
public:
	Data(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}
	Data(const Data d) {
		//……
	}
private:
	int _year=1;
	int _month=1;
	int _day=1;
};
int main()
{
	Data a(2024,6,11);
	Data b(a);
	return 0;
}

●b实例化的时候,就会去调用拷贝构造,然后把实参a传给形参d.

●但是传值要进行拷贝,调用d拷贝构造,把a拷贝给d。

●差不多每次传给另外一个参数,就要调用一次拷贝构造,这样就会一直重复下去。


🍉特点四:

如果我们不显式实现,因为也是属于默认成员函数,所以编译器会自己生成。编译器会自己生成,编译器自己生成的拷贝构造函数是按内存存储按字节序列进行拷贝的。这种拷贝叫浅拷贝,或者值拷贝。因为如果类的成员有的是指针,那也是拷贝同样的指针,这样是不行的。

自定义类型就是调用它的拷贝构造函数。

总结:

如果一个类有空间申请,那么一定要显式自己写拷贝构造函数。如果没有资源的清理,那么编译器生成的也是可以的。比如日期类就不要显式实现。

拷贝构造函数三种调用场景:

1.在创建新的对象的时候,参数是同类型对象的引用。

2.在传值传参的时候,也是要调用拷贝构造函数的。

3.当类类型作为返回值的时候,也是要调用拷贝构造函数的。

从上面的三种场景来看,日常我们可以不用传值就不要用传值。也就是尽可能的使用传引用,除非特殊情况一定要用传值。

✍运算符重载:

概念:

在类中,为了增强代码的可读性,C++中引入了运算符重载这一概念。因为是重载,所以我们也可以推断出,我们用一样的运算符,但是是不同的类型的时候,就会调用不同的函数。

运算符重载是特殊函数名的函数,有返回类型和参数,返回类型和参数与普通的函数差不多。

●函数名:operator+要重载的运算符。

●原型:返回类型    函数名(参数列表)。

●必须是已存在的运算符才能重载,比如>,<。@这个符号就不能进行运算符重载。

●重载操作符必须有一个类类型的参数。

●虽然看起来形参比操作对象少一个,其实是隐藏了一个this指针,this指针是指向最前面那个操作对象的。

●   .*       sizeof       ::     .     ?:        这五个运算符是不能进行重载的。

🍭赋值运算符重载:

赋值运算符重载的格式:

● 参数类型:const  类型&,传递引用可以提高效率。

●返回类型:类型&(这个类类型的引用),返回引用是为了可以支持连续赋值,比如c=b=a,顺序是,先是a给b赋值,然后返回b,然后在b给c赋值。

●赋值运算符只能重载成类的成员函数,不能重载为全局函数。

因为如果重载为全局函数,这时候在类里面没有显示实现,所以编译器会自己生成一个赋值运算符。这样我们调用赋值的时候,编译器就不知道去调用哪个赋值函数。

●编译器自己生成的赋值运算符,对于内置类型,也是去按内存的字节序进行赋值。对应自定义类型,那么就去调用它的赋值运算符函数。

下面是日期类的显式赋值运算符重载:

#pragma once
#include<iostream>
#include<stdbool.h>
#include<assert.h>
#include<math.h>
using namespace std;
public:
	//全缺省的构造函数
	Data(int year = 1, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造函数
	Data(const Data& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	//赋值运算符重载
    Data& operator = (const Data& d) {
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;
}


	//析构函数
	~Data() {
		_year = -1;
		_month = -1;
		_day = -1;
	}
private:
	int _year;
	int _month;
	int _day;
};


🍭前置++和后置++的重载:

先来说这两个的区别:

1.前置++:调用++函数以后,返回++之的值。

2.前置++:调佣++函数以后,返回++之的值。

因为这两个++的函数名都是operator++,为了构成区分,我们的C++祖师爷在后置++里面放了一个int参数,这样与前置++就可以构成函数重载;

因为前置++可以返回的++以后的值,所以我们++以后,就直接可以用引用返回。

但是后置++,返回的++之前的值,这样我们传值返回。

日期类的前置++和后置++:

#pragma once
#include<iostream>
#include<stdbool.h>
#include<assert.h>
#include<math.h>
using namespace std;

class Data {
	friend ostream& operator<<(ostream& out, Data& d);
	friend istream& operator>>(istream& in, Data& d);
public:
	//全缺省的构造函数
	Data(int year = 1, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	//拷贝构造函数
	Data(const Data& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
    //+=运算符重载
    Data& operator+=(int day) {
    	if (day < 0)
	    {
		    return *this -= -day;
	    }
	    _day += day;
	    while (_day > GetDay(_year,_month))
	    {
		    _day -= GetDay(_year, _month);
		    _month++;
		    if (_month == 13)
		    {
			    _month = 1;
			    _year++;
		    }
	    }
	return *this;
    }

	//日期的前置++
	Data& operator++() {
	    return *this += 1;
    }

    //日期的后置++
    Data operator++(int) {
	    Data a = *this;
	    *this += 1;
	    return a;
    }
	Data operator++(int);

	//析构函数
	~Data() {
		_year = -1;
		_month = -1;
		_day = -1;
	}
private:
	int _year;
	int _month;
	int _day;
};


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件比较:Redis,Kafka和RabbitMQ

对微服务使用异步通信时&#xff0c;通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定&#xff0c;消息在系统内得到管理和监控&#xff0c;并且消息不会丢失。您可以从几个消息代理中进行选择&#xff0c;它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

基于深度图像的无监督目标跟踪

概要 大致的步骤 深度图像获取:通过深度传感器(例如ToF相机、双目相机等)获取场景的深度图像。深度图转scanscan转pointcloud点云聚类卡尔曼滤波预测匈牙利算法匹配目标ID更新深度图转scan 参考这篇博客 scan转pointcloud

科技云报道:“元年”之后,生成式AI将走向何方?

科技云报道原创。 近两年&#xff0c;以大模型为代表的生成式AI技术&#xff0c;成为引爆数字原生最重要的技术奇点&#xff0c;人们见证了各类文生应用的进展速度。Gartner预测&#xff0c;到2026年&#xff0c;超过80%的企业将使用生成式AI的API或模型&#xff0c;或在生产环…

C++基础(二)

选择结构 选择结构是用来控制程序流程&#xff0c;使得程序可以根据不同的条件执行不同的代码块。 if语句 简单结构 if (表达式) { // 表达式为真时执行的语句。 } else { // 表达式为假时执行的语句。 } #include <iostream> #include <string>using namespace s…

卫星通讯传输电力运维巡检EasyCVR视频汇聚平台智能监控方案

随着科技的快速发展&#xff0c;视频监控技术已广泛应用于各个领域。而卫星通讯作为一种高效、稳定的通信方式&#xff0c;为视频监控系统的远程传输提供了有力支持。 一、方案背景 随着电力行业的快速发展&#xff0c;电力运维巡检工作变得愈发重要。传统的巡检方式往往受到…

知识图谱的应用---新零售

文章目录 新零售知识图谱构建过程典型应用 新零售 新零售&#xff0c;即个人、企业以互联网为依托&#xff0c;通过运用大数据、人工智能等先进技术手段并运用心理学知识&#xff0c;对商品的生产、流通与销售过程进行升级改造&#xff0c;进而重塑业态结构与生态圈&#xff0c…

镜舟科技携手中通快运,入选 2024 爱分析·数据库应用实践报告

典型案例&#xff1a;中通快运重构数据中心&#xff0c;满足业务多种复杂分析需求 中通快运成立于2016年&#xff0c;是中通品牌旗下快运企业&#xff0c;聚焦数智物流新趋势&#xff0c; 提供面向企业及个人客户的全链路一站式物流服务。目前中通快运全国揽派件网点有21000 余…

MySQL存储引擎详述:InnoDB为何胜出?

MySQL作为当前最流行的开源关系型数据库之一,其强大的功能和良好的性能使其广泛应用于各种规模的应用系统中。其中,存储引擎的设计理念是MySQL数据库灵活高效的关键所在。 一、什么是存储引擎 存储引擎是MySQL架构的重要组成部分,负责MySQL中数据的存储和提供了视图,存储过程等…

大疆智图_空三二维重建成果传输

一、软件环境 1.1 所需软件 1、 大疆智图&#xff1a;点击下载&#xff1b;   2、 ArcGIS Pro 3.1.5&#xff1a;点击下载&#xff0c;建议使用IDM或Aria2等多线程下载器&#xff1b;   3、 IDM下载器&#xff1a;点击下载&#xff0c;或自行搜索&#xff1b;   4、 Fas…

初出茅庐的小李博客之CJSON库解析心知天气数据

心知天气数据JSON格式介绍 JSON格式介绍http://t.csdnimg.cn/pJX1n 下面代码是利用CJSON库进行数据解析 解析代码 #include <stdio.h> #include <string.h> #include "cJSON.h" // 假设你的CJSON库头文件路径是正确的int main(void) {// 提供的JSON…

LLM基础介绍

文章目录 一、语言模型1、概念2、预训练语言模型3、NLP4、benchmark1&#xff09;概念2&#xff09;GLUE 5、TPU6、语料 二、神经网络1、概念2、训练神经网络3、案例&#xff1a;word2vec3、RNN&#xff08;循环神经网络&#xff09;4、GRU5、LSTM&#xff08;长短时记忆网络&a…

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环&#xff0c;但是STL又是一个庞大的章节&#xff0c;因此这里我们先简单介绍一下STL&#xff0c;有助于后面我们对STL的学习&#xff0c;这里就是做一个简单的介绍&#xff0c;并无干货。 1.什么是STL STL(standard templa…

Python自动化测试框架pytest的详解安装与运行

1. pytest的介绍 pytest是一个非常成熟的全功能的python测试工具&#xff0c;它主要有以下特征&#xff1a; 简单灵活&#xff0c;容易上手&#xff1b; 支持简单的单元测试和复杂的功能测试 显示详细的断言失败信息 能自动识别测试模块和测试功能 有测试会话、测试模块、…

【全开源】多平台租房系统源码(Fastadmin+ThinkPHP+Uniapp)

&#x1f3e0;多平台租房系统&#xff1a;一站式租房新体验&#x1f50d; &#x1f310;一、引言&#xff1a;租房市场的变革 在快节奏的现代生活中&#xff0c;租房已成为许多人解决居住问题的首选。然而&#xff0c;传统的租房方式往往繁琐且效率低下。随着互联网的飞速发展…

1996-2023年各省农林牧渔总产值数据(无缺失)

1996-2023年各省农林牧渔总产值数据&#xff08;无缺失&#xff09; 1、 时间&#xff1a;1996-2023年 2、 来源&#xff1a;国家统计局、统计年鉴 3、 指标&#xff1a;农林牧渔总产值 4、 范围&#xff1a;31省 5、 缺失情况&#xff1a;无缺失 6、 指标解释&…

【课程总结】Day7:深度学习概述

前言 本篇文章&#xff0c;我们将通过示例来逐步学习理解导数、求函数最小值、深度学习的本质、以及使用numpy和pytorch实操深度学习训练过程。 线性回归 线性回归内容回顾 在《【课程总结】Day5(下)&#xff1a;PCA降维、SVD分解、聚类算法和集成学习》中&#xff0c;我们…

6.Hugging Face Transformers 快速入门

Hugging Face Transformers 库独特价值 丰富的预训练模型&#xff1a;提供广泛的预训练模型&#xff0c;如BERT、GPT、T5等&#xff0c;适用于各种NLP任务。易于使用&#xff1a;设计注重易用性&#xff0c;使得即使没有深厚机器学习背景的开发者也能快速上手。最新研究成果的…

数据结构下的线性回归模型

文章目录 1. 线性回归模型的基本概念与原理2. 数据结构在构建线性回归模型中的应用2.1 数组和矩阵2.2 列表2.3 字典2.4 数据框架 3. 线性回归模型的实现方法4. 示例代码演示总结 线性回归是统计学中最基础也是应用最广泛的预测模型之一&#xff0c;主要用于分析两个或两个以上变…

Unity图集

概述 相信在同学们学习过程中&#xff0c;在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件&#xff0c;有同学们好奇&#xff0c;那为什么还要使用图集呢&#xff1f; 这就需要提到一个性能优化的问题了&#xff0c;因为过多的UI图片&#xff0c;会大幅增加Dra…

pip切换至国内镜像超简单方法

新配置的python环境&#xff0c;pip安装包超时 这里给出最简单配置国内镜像的方法 这里将服务器地址切换为国内清华镜像&#xff0c;具体执行的命令如下&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 执行完&#xff0c;看到上面提…