从入门到了解C++系列-----类与对象(中)

news2024/11/25 9:33:22

首言

    这是我对于在学习类与对象时的一些思考与总结。主要去讲解C++自主实现的默认构造函数。

 1. 6大默认成员函数

  1.1 是什么

     默认的成员函数,是由c++ 编译器自动生成的。我们即使不定义,也可以调用。有默认构造函数、默认拷贝构造函数、默认析构函数、赋值重载、对于不同对象与const对象取地址重载(最后这个不常见)。

2  构造函数

  1.2.1 是什么

    构造函数,是对于类的对象进行赋值的一个函数(注意这里不是进行初始化!初始化的话需要使用初始化列表,详细内容我将会在下中详细讲解)。它的特点是:类名就是他的函数名。他的代码使用如下所示:(以Date类进行举例)

//这种定义方式有很大的缺陷
Date(int year, int month, int day)
{
    _year = year;
    _month = month;
    _day = day;
}

     大家请看这两张图片:可以发现,当我们重新定义了构造函数的时候,我们就只能定义成第一张图的样子,当定义为空(或者其他)的时候就会出错。所以很不建议使用这种方法来进行定义。

 

     最推荐的方法如下:使用全缺省的方法来进行实现:

Date(int year = 1997, int month = 1, int day = 1)
{ 
    _year = year;
    _month = month;
    _day = day;
}

1.2.2 注意细节

    特点:1.没有返回值。2.对象实例化时编译器自动调用对应的构造函数。3.可以进行重载。

还有一点默认的构造函数仅仅只会对自定义类型的成员函数进行调用,对于内置类型的成员函数不会调用构造函数,依旧是随机值。

    常见的默认构造函数有三个:1.我们不写编译器自动生成的。

                                                   2.全缺省的也是我最推荐的。

                                                   3.无参数的构造函数。

3  析构函数

   3.1 是什么 

    对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。。书写是 ~ + 类名 。

具有三个特征:1.函数没有返回值   2.析构函数不能重载。

~Date()
{}

    需要特别注意的是,内置成员变量(int ,char,...),销毁时不需要资源的清理,最后系统直接将其内存回收了即可。但是对于自定义类型的成员变量,在销毁的时候需要调用他的析构函数。通过下面的代码,即可了解。

class Time
{
public:
	~Time()
	{
		cout << "This is ~Time()" << endl;
	}
private:
	int _hour;
	int _month;
	int _s;
};
class Date
{
public:
private:
	int _day;
	int _month;
	int _year;
	Time t;
};

 4 拷贝构造函数

   4.1 是什么

    拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。相当于复制一个一模一样的自己。最重要的工作是完成对象的拷贝。

特征:1. 相当于是对于构造函数的一个重载功能。

2.传递的参数,只有一个并且是对于对象的引用传递,如果使用类进行传递会引发无穷递归。

	Date(const Date &d1)
	{
		_year = d1._year;
		_month = d1._month;
		_day = d1._day;
	}

3.其次比较重要的一点是:拷贝构造函数是进行初始化,适用于没有创建好的类对象。需要跟赋值运算符的重载区分开。

4.2 赋值运算符的重载

    关于赋值运算符,它只能定义为成员函数存放在类里面,不能够放在在外面。这样的话会造成主要的main 函数与重载的 = 相互冲突。

//实现赋值运算符的重载	
Date& operator=(const Date& d)
	{
		_day = d._day;
		_month = d._month;
		_year = d._year;
	}

4.3 深、浅拷贝 

    当我们将赋值运算符重载,拷贝构造给删除掉。我们依然可以使用拷贝跟运算符的重载。这里就是按照字节来进行的值拷贝,将其称之为:浅拷贝。

而深拷贝就是我们进行对赋值运算符的重载,以及对于拷贝构造函数的重载

    我们不用定义的话,也可以实现一些值拷贝,那我们为什么还要进行深拷贝呢?我们在 date 日期来可能不明显,但是当我们对 Stack 栈,进行拷贝的时候就会出现许多的问题。当按照字节进行拷贝,会使他指向同一块空间的进行删除的操作,会对同一块空间重复的删除,引发大量的问题。

  

    对于后面的两个默认的成员函数,就不再进行详细的讨论。

5 其他运算符的重载

    5.1 前置与后置++的重载。 

Date& operator++()//前置++
	{
		_day++;
		return *this;
	}
	Date operator++(int)//后置++
	{
		Date cur = *this;
		_day++;
		return cur;
	}

  1.5.2  -- 的重载

	Date& operator--()
	{
		_day--;
		return *this;
	}
	Date operator--(int)
	{
		Date tmp = *this;
		_day--;
		return tmp;
	}

关于这里面的为什么去使用 Date&,有的是去使用Date。是因为前置的++,返回已经改变的值使用引用,可以提高效率。对于后置的++需要返回之前的值,如果是使用引用的话,这个出了作用域就不存在了。所以应当去使用Date来作为返回值。

2. const成员

    const 去修饰的函数称之为 const成员函数。实际上对于类来说是去修饰的的 *this指针,表示里面不能对 *this 所指向的内容进行修改。

    接下来思考几个问题:

1. const对象可以调用非const成员函数吗?
2. 非const对象可以调用const成员函数吗?
3. const成员函数内可以调用其它的非const成员函数吗?
4. 非const成员函数内可以调用其它的const成员函数吗?

1.不可以,因为有const修饰的对象是可写的,但是非cosnt成员函数是可读可写的。扩大了范围。

2.可以  3.不可以,一样的扩大了范围  4.可以

 结尾

 在这里只是进行一些简单的解释,想要更加深入的了解的话需要实现Date日期类。如果对你有帮助还请帮我点个免费的赞,支持一下我,我也会不断地改进争取写出跟高质量的文章。我们共同努力!!!!

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

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

相关文章

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

SCSI驱动与 UFS 驱动交互概况

SCSI子系统概况 SCSI&#xff08;Small Computer System Interface&#xff09;子系统是 Linux 中的一个模块化框架&#xff0c;用于提供与存储设备的通用接口。通过 SCSI 子系统&#xff0c;可以支持不同类型的存储协议&#xff08;如 UFS、SATA、SAS&#xff09;&#xff0c…

5. 数据库连接池实现

WebServer 类中的 sql_pool() 方法&#xff0c;用于初始化数据库连接池并设置用户数据。 void WebServer::sql_pool() {/* 初始化数据库连接池 */m_connPool connection_pool::GetInstance();m_connPool->init("localhost", m_user, m_passWord, m_databaseName,…

Unity BesHttp插件修改Error log的格式

实现代码 找到插件的 UnityOutput.cs 然后按照需求替换为下面的代码即可。如果提示 void ILogOutput.Flush() { } 接口不存在&#xff0c;删除这行代码即可。 using Best.HTTP.JSON.LitJson; using System; using System.Collections.Generic; using UnityEngine; using Syst…

Kubernetes实战——DevOps集成SpringBoot项目

目录 一、安装Gitlab 1、安装并配置Gitlab 1.1 、下载安装包 1.2、安装 1.3、修改配置文件 1.4、更新配置并重启 2、配置 2.1、修改密码 2.2、禁用注册功能 2.3、取消头像 2.4、修改中文配置 2.5、配置 webhook 3、卸载 二、安装镜像私服Harbor 1、下载安装包 2、…

【移动应用开发】访问网络

目录 一、运行截图 二、源代码 1. WebView的简单使用 ① activity_main.xml ② MainActivity.kt ③ AndroidManifest.xml 2. 使用OkHttp访问以下接口&#xff0c;获取Aspirin化合物的JSON格式数据 ① activity_okhttp.xml ② OKhttpActivity ③ 导入依赖 3. 使用GSO…

软件工程--需求分析与用例模型

面向对象分析(ObjectOrientedAnalysis&#xff0c;简称OOA) 分析和理解问题域&#xff0c;找出描述问题域所需的类和对象&#xff0c;分析它们的内部构成和外部关系&#xff0c;建立独立于实现的OOA模型&#xff0c;暂时忽略与系统实现有关的问题。 主要使用UML中的以下几种图…

Android中同步屏障(Sync Barrier)介绍

在 Android 中&#xff0c;“同步屏障”&#xff08;Sync Barrier&#xff09;是 MessageQueue 中的一种机制&#xff0c;允许系统临时忽略同步消息&#xff0c;以便优先处理异步消息。这在需要快速响应的任务&#xff08;如触摸事件和动画更新&#xff09;中尤为重要。 在 An…

MyBatis-Plus:简化 CRUD 操作的艺术

一、关于MyBatis-Plus 1.1 简介 MyBatis-Plus 是一个基于 MyBatis 的增强工具&#xff0c;它旨在简化 MyBatis 的使用&#xff0c;提高开发效率。 ​ ‍ ‍ ‍ ​ ‍ 关于Mybatis 简介 MyBatis 是一款流行的 Java 持久层框架&#xff0c;旨在简化 Java 应用程序与数…

ECharts饼图-圆角环形图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…

正则表达式匹配日期格式

前言 这里有sql文本&#xff0c;是从数据库中拷贝出来的&#xff0c;希望重新执行的时候createTime和updateTime都统一设置成当前日期。 利用正则表达式结合文本编辑器&#xff0c;就能全局替换了 (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 替换结果如下

学习伊圣雨老师的 epoll 编程

&#xff08;1&#xff09;书里提出了疑问&#xff0c;epoll 函数的工作方式&#xff0c;区分为水平触发与边缘触发 &#xff1a; &#xff08;2&#xff09; 谢谢

3.2K+ Star!OpenLLMetry:一个开源的LLM应用可观测性工具

OpenLLMetry 简介 OpenLLMetry[1] 是一个基于OpenTelemetry的开源可观测性工具&#xff0c;专为LLM&#xff08;Large Language Models&#xff0c;大型语言模型&#xff09;应用设计。 它提供了一套扩展&#xff0c;可以帮助开发者全面监控和管理他们的LLM应用。 项目特点 主…

C# 编程语言学习教程

C# 编程语言学习教程 目录 C# 简介 1.1 什么是 C#1.2 C# 的特点1.3 C# 的应用领域 环境搭建 2.1 安装 Visual Studio2.2 创建第一个 C# 项目 基础语法 3.1 数据类型3.2 控制结构3.3 数组与字符串 面向对象编程 4.1 类与对象4.2 继承与多态4.3 接口与抽象类 常用库与框架 5.1 .…

分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)

分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB) 目录 分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)分类效果基本介绍程序设计参考资料分类效果 基本介绍 GCN图卷积神经网络多特征分类预测(MATLAB) 在图卷积神经网络(GCN)中,多特征分类

以AI赋能身份验证,Jumio助力中国企业出海

近年来&#xff0c;越来越多的中国企业开始扬帆出海积极拓展全球市场。而能够为企业出海提供各种助力的技术与解决方案&#xff0c;也成为了众多企业关注的焦点。 作为全球领先的在线身份验证和欺诈预防解决方案提供商&#xff0c;Jumio于近日在北京举办了中国媒体见面会&#…

中级 <HarmonyOS第一课>合理使用动画和转场的课后习题

天道无亲&#xff0c;常与善人。 天命人&#xff0c;战斗吧&#xff01;&#xff01;&#xff01; 来自 <HarmonyOS第一课>合理使用动画和转场的习题。 判断题 animateTo可以设置组件进行位移动画时的运动路径。❌ 单选题 模态转场不包括以下哪个类别&#xff1f; A. …

Python(包和模块)

包 定义 包是将模块以文件夹的组织形式进行分组管理的方法&#xff0c;以便更好地组织和管理相关模块。 包是一个包含一个特殊的__init__.py文件的目录&#xff0c;这个文件可以为空&#xff0c;但必须存在&#xff0c;以标识目录为Python包。 包可以包含子包&#xff08;子…

数据采集-Kepware OPCUA 服务器实现

KepserverEX OPC UA server设置 目录 KepserverEX OPC UA server设置一、OPC UA(OPC Unified Architecture)二、防火墙的配置三、配置KepserverEX的OPC UA3.1 启用远程连接3.2 启动OPCUA服务器接口 四、管理OPCUA的端口和证书4.1 添加端口4.2 证书申请 一、OPC UA(OPC Unified …

医学和生信web APP 平台- Appmatrix

医学&#xff08;和生信&#xff09;web APP 平台- Appmatrix 最近使用shinyproxy将平时所构建的shiny和streamlit医学类应用汇集在一起&#xff0c;实现一站式访问&#xff0c;另外&#xff0c;使用了自己电脑内网穿透&#xff0c;一定程度上缓解了数据分析类APP消耗计算资源…