类和对象 中篇

news2024/11/15 10:10:11

类和对象 中篇

​   在上篇中,我们介绍了类的基础部分,本篇我们讲解C++类的六大默认成员函数

Pasted image 20240708193844

​   所谓默认成员函数,就是我们不写编译器也会自动生成,自动调用的函数。而自动生成的函数对内置类型的成员不会处理(有些高版本编译器会处理,且C++11以后支持声明给缺省值),对自定义类型的成员会去调用对应的函数

​ ​   默认成员函数最大的用处就是自动调用,我们在C语言中写栈、顺序表的时候经常忘记初始化和置空,而默认成员函数很好的解决了这一点,只需要执行代码,之后的初始化和置空等操作都是自动进行,我们就不需要再去手动完成。

​   下面开始依次介绍默认成员函数🧐

构造函数🤔

​   构造函数是特殊的成员函数,它主要用于初始化对象,其特征为:

  1. 函数名与类名相同
  2. 无返回值
  3. 对象实例化时编译器自动调用对应的构造函数
  4. 可以对其重载

​   如下图,对象d1在没有调用Date函数的情况下,自动完成了初始化。

image-20240712201634395

​   并且在C++11后的版本,支持内置类型给全省值

Pasted image 20240708203532

​   注意,以下写法是错误的,因为编译器不知道是声明还是创建对象

image-20240714135000289

​   对于内置类型,编译器不会处理,而自定义类型编译器会去调用该类型的默认构造,如果没有默认构造就会报错。

Pasted image 20240708204153

​   最后,默认构造函数只能存在一个(不包括重载):全缺省构造函数,无参构造函数,没写自动生成的构造函数,如果写了构造函数,那么将不再自动生成。

析构函数🤔

​   析构函数与构造函数功能相反,用于对象的销毁,当对象生命周期结束时会自动调用析构函数,完成资源清理的工作,它的特征为:

  1. 析构函数要在类名前加上~
  2. 无参无返回值
  3. 一个类仅有一个析构函数,且不能重载
  4. 对象声生命周期结束时会自动调用析构函数
  5. 先定义的对象后清理(定义对象需要建立栈帧,栈的结构为先进后出)

​   如下图析构函数的自动调用实例,构造函数初始化a,析构函数将a置空

image-20240714144636239

image-20240714142826724

​   默认析构函数与构造函数相同,对内置类型不处理,自定义类型会调用该类型的析构函数。 ​ Pasted image 20240708232450

​   注意:析构函数在下图情况会崩溃,原因是没有写拷贝构造,导致这里的赋值是直接将地址传给st2,造成浅拷贝。st1和st2共用一个空间,当两个对象生命周期结束时,st2会先进行析构,此时空间被销毁了,st1再去析构就访问到野指针,故程序崩溃。

image-20240714150656612

image-20240714145311460

拷贝构造🤔

​   拷贝构造函数也是特殊的成员函数,特征如下:

  1. 拷贝构造是构造函数的一个重载形式

  2. 拷贝构造的参数只有一个,且只能是类类型对象的引用,如果不加引用会导致无穷递归(传参生成临时变量,临时变量接收参数,此时就是拷贝,拷贝又会去调用拷贝构造,造成套娃)

      两种拷贝方式

    Pasted image 20240710125300

  ​ 参考栈的拷贝构造,我们建立一个新的空间,再将数据全部赋过去,st1和st2就成了两个独立空间,再进行析构就没有问题了。

image-20240714150912051

image-20240714150927735

​   拷贝构造对内置类型浅拷贝,自定义类型会调用该类型的拷贝构造。赋值是两个存在的对象进行拷贝,拷贝构造是一个已经存在的对象去初始化另一个要创建的对象

运算符重载🤔

​   运算符无法识别非内置类型之间的比较,这时运算符重载就派上用场了

image-20240714152332580

​   运算符重载需要用到关键字operator,其格式为(const可加可不加,后面会介绍):

返回值 operator运算符(参数)
{
    //...
}
//如
bool operator<(Date& d)
{
    //...
}

image-20240714152530955

​   运算符重载的特性为:

  1. 不能自己创建C++没有的操作符,比如operator@
  2. 用于内置类型的运算符,含义无法改变
  3. 重载操作符必须有一个类类型参数(在类中有this作为类类型参数)
  4. 作为类成员函数重载时,形参看起来比操作数少,是因为成员函数的第一个参数为隐藏的this
  5. .* sizeof . ?: ::五个运算符不能重载

取地址运算符的重载(const和非const)🤔

​   取地址(&)运算符其实也无法识别非内置类型,但是编译器将其函数加入了默认成员函数,所以我们可以不写也能使用该运算符。但是当我们不想让别人取到对象的地址时,就可以手动写对其修改。如下图我们传回nullptr,那么别人就拿不到对象的地址了。

Date* Date::operator&()
{
	return nullptr; //传回空 
}

const Date* Date::operator&() const
{
	return this; //传回地址
}

image-20240714154336354>
​   此外,如果对象被const修饰,那么就会调用const版取地址运算符的重载

image-20240714155931678

​   注意:这里流插入运算符是重载后才能使用,代码如下:

ostream& operator<<(ostream& out, const Date& d) //双操作数,左操作数为第一个参数,成员函数this只能在第一位,所以不能在类里面定义
{
	out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
	return out;
}

istream& operator>>(istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}

成员函数const的用法🤔

​   在成员函数中,由于this指针是隐式的,且无法显式的写出来,所以当我们传给成员函数一个const修饰的对象就会出现这个问题:

void Print()
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}

image-20240714160819127

​   Print接收的是Date* this的参数,但我们传过去的是const Date*,属于权限放大。因为无法在参数中修饰this指针,所以C++的做法就是把const放在函数名之后作为this的修饰。

void Print() const
{
	cout << _year << "年" << _month << "月" << _day << "日" << endl;
}

image-20240714161500637

​   并且,只读函数加上const读写分离能够更好的保护数据

结尾👍

  以上便是六大成员函数的介绍,如果有疑问或者建议都可以私信笔者交流,大家互相学习,互相进步!🌹

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

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

相关文章

FreeRTOS 入门 知识

什么是FreeRTOS FreeRTOS 是一个轻量级的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;由 Richard Barry 在 2003 年开发&#xff0c;并且由亚马逊的 FreeRTOS 项目&#xff08;一个由 Amazon Web Services (AWS) 支持的开源项目&#xff09;进一步推动和发展。FreeR…

python开发遇到的坑汇总

文章目录 1.点击导入操作&#xff0c;所有配置全没了 1.点击导入操作&#xff0c;所有配置全没了 在 PyCharm 中&#xff0c;如果你遇到了点击导入&#xff08;import&#xff09;操作后&#xff0c;项目似乎进行了重新安装或重新部署的情况&#xff0c;这通常不是由简单的导入…

在Linux上设置MySQL允许远程连接的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Vue3+Vite+TS+Axios整合详细教程

1. Vite 简介 Vite是新一代的前端构建工具&#xff0c;在尤雨溪开发Vue3.0的时候诞生。类似于Webpack Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个概念&#xff0c;服务器随起随用。生产中利用…

达梦数据库的系统视图v$sessions

达梦数据库的系统视图v$sessions 达梦数据库&#xff08;DM Database&#xff09;是中国的一款国产数据库管理系统&#xff0c;它提供了类似于Oracle的系统视图来监控和管理数据库。V$SESSIONS 是达梦数据库中的一个系统视图&#xff0c;用于显示当前数据库会话的信息。 以下…

数据结构(Java):LinkedList集合Stack集合

1、集合类LinkedList 1.1 什么是LinkedList LinkedList的底层是一个双向链表的结构&#xff08;故不支持随机访问&#xff09;&#xff1a; 在LinkedList中&#xff0c;定义了first和last&#xff0c;分别指向链表的首节点和尾结点。 每个节点中有一个成员用来存储数据&…

Oracle 物化视图详解与实践

一.视图是什么&#xff1f; 普通视图只是存放在数据字典当中的子查询&#xff0c;本身没有数据&#xff0c;数据来源于基表&#xff0c;可以把普通视图当作编译好的sql语句。 二.物化视图是什么&#xff1f; 把查询到的数据存放起来&#xff0c;为了以后再次查询使用&#xff0…

NiFi1.25版本HTTPS模式下RestAPI使用入门

Apache NiFi 是一个强大的数据流处理工具&#xff0c;通过其 REST API&#xff0c;用户可以远程管理和控制数据流处理器。本文将介绍如何使用 NiFi 1.25 版本HTTPS 模式下Rest API&#xff0c;包括获取 token、获取组件信息、启动和停止组件、以及更改组件的调度频率等操作。 …

2.2动态库

动态库的特性 位置无关代码(PIC - position independent code) 库中的符号&#xff0c;不需要提前存储在可执行文件中&#xff0c;只有当链接时&#xff0c;可执行文件才会将需要的代码函数链接到内存中。 制作动态库 编写主函数 test.c #include<stdio.h> int main…

Java 设计模式系列:解释器模式

简介 解释器模式是一种行为型设计模式&#xff0c;它提供了一种构建抽象语法树的机制&#xff0c;并定义了如何解释这棵树。解释器模式属于编译原理中的语法制导翻译的范畴。 如上图&#xff0c;设计一个软件用来进行加减计算。我们第一想法就是使用工具类&#xff0c;提供对应…

优雅单片机之STM32C8T6----------程序下载(1)

0&#xff0c;C8T6系列 若想查看视频以及讲解&#xff0c;请查看B站或者抖音视频。 1&#xff0c;入门程序的下载&#xff08;本文&#xff09; 2&#xff0c;蓝牙控制&#xff08;待定&#xff09; 3&#xff0c;蓝牙小车&#xff08;待定&#xff09; 一&#xff0c;USB转…

springboot3 web

springboot web配置 springboot web的配置有&#xff1a; SpringMvc配置的前缀为&#xff1a;spring.mvcweb场景的通用配置为&#xff1a;spring.web文件上传的配置为&#xff1a;spring.servlet.multipart服务器相关配置为&#xff1a;server 接管SpringMVC 的三种方式 方…

深圳晶彩智能JC3636W518C开发环境Arduino IDE配置

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的&#xff0c;铝合金外壳&#xff0c;价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派&#xff0c;由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

Java File类(一) -- springboot项目根目录下进行文件的读取、写入与清空内容的操作

目录 1.存储的位置 2.FileOperationUtil工具类源代码 1.存储的位置 2.FileOperationUtil工具类源代码 import org.springframework.util.FileCopyUtils; import java.io.*; import java.nio.charset.StandardCharsets;/*** @ClassName FileOperationUtil* @Description 文件…

卡码网KamaCoder 101. 孤岛的总面积

题目来源&#xff1a;101. 孤岛的总面积 C题解&#xff1a;在卡码网KamaCoder 100. 岛屿的最大面积-CSDN基础上加了个孤岛flg进行修改 #include <iostream> #include <vector> #include <queue>#include <stdio.h> using namespace std;int res 0, t…

【2024_CUMCM】时间序列3-一元时间序列分析的模型

目录 时间序列的平稳性 弱平稳 白噪声序列 序列图 差分方程 滞后算子 AR(p)模型 概念 平稳 例子 MA(q)模型 ARMA(p,q) 自回归移动平均模型 平稳性 ACF自相关系数 PACF偏自相关函数 AR(1)模型图 MA(1)与AR(2)图 ARMA(1,1)图 ARMA模型的识别 ARMA模型的估计…

【计算机视觉】3D重建:使用MeshLab进行表面重建(以泊松重建为例)

一、MeshLab 1、简介 MeshLab是一款功能强大的开源三维网格处理软件&#xff0c;主要用于编辑、修复、简化和可视化三维三角形网格和点云数据。它支持PLY、STL、OBJ、3DS、COLLADA等多种常用的3D文件格式&#xff0c;提供了网格清理、修复、简化、纹理映射、参数化、布尔运算等…

多平台内网穿透工具-frp配置(下载安装、开机自启)

✨本教程使用Windows做客户端&#xff0c;Ubuntu做服务端。服务端需要能公网访问&#xff0c;可以去腾讯或者阿里购买vps。 本教程所采用的工具可在蓝奏云中下载。下载地址&#xff1a;https://wwt.lanzoue.com/b0fomaeta密码:1k1u frp官方文档地址&#xff1a;https://gofrp.o…

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…

【问题项目】freeswitch的web界面YouPBX —— 筑梦之路

开源地址&#xff1a;GitHub - JoneXiong/YouPBX: A great GUI manager for FreeSwitch 说明&#xff1a;该项目是基于python 2.7django开发 这里主要记录下搭建使用过程 # 拉取代码git clone https://github.com/JoneXiong/YouPBX.gitgit clone https://github.com/JoneX…