【C++】类和对象(二)

在这里插入图片描述
个人主页
在这里插入图片描述
创作不易,感谢大家的关注!

文章目录

  • ⭐一、类的默认成员函数
  • 💎二、构造函数
  • ⏱️三、析构函数
  • 🏝️ 四、拷贝构造函数
  • 🎄五、赋值运算符重载
  • 🏠六、取地址运算符重载
    • 🎉const成员

⭐一、类的默认成员函数

定义:所谓的默认成员函数,就是用户没有显式实现,而编译器会自动生成的成员函数就被称为默认成员函数。
在一个类中,在我们不写的情况下编译器会自动生成以下六个默认成员函数。其中最重要的是前四个,而取地址重载可以作为了解即可。
在这里插入图片描述

💎二、构造函数

  1. 定义:构造函数是一个特殊的成员函数,其名字与类名相同,在创建类类型对象时由编译器自动调用,保证每一个对象成员都有初始值,并在对象的生命周期内只调用一次。

  2. 特点:
    1.函数名与类名相同。
    2.没有返回值。
    3.对象实例化时系统会自动调用对应的构造函数。
    4.构造函数可以重载。

  3. 功能:
    构造函数不是用来构造对象的,它是来完成对象初始化的。

  4. 注意事项:
    1.如果类中没有显式定义构造函数,那么C++编译器会自动生成一个无参的默认构造函数,一旦用户定义则编译器将不再生成。
    2.无参构造函数、全缺省构造函数和当我们不写构造时编译器默认生成的构造函数,都被称为默认构造函
    数。但是这三个函数有且仅有一个存在,不能同时存在。

演示代码:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;class Date
{
public:// 1.无参构造函数Date(){_year = 1;_month = 1;_day = 1;}//2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}//3.全缺省构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

⏱️三、析构函数

  1. 概念:与构造函数的功能相反,析构函数并不是完成对对象本身的销毁,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。
  2. 特点:
    1.析构函数名是在类名前加上字符 ~。
    2.无参数和无返回值。
    3.⼀个类只能有⼀个析构函数。若未显式定义,系统会自动生成默认的析构函数。
    4.对象生命周期结束时,编译器会自动调用析构函数。
  3. 功能:
    完成对象中资源的清理释放工作。
  4. 注意事项:
    1.我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定义类型成员会调用他的析构函数。
    2.如果类中没有申请资源时,析构函数可以不写,直接使用编译器自动生成的默认析构函数。
    (注:在有资源申请时,一定要自己写析构函数,否则会造成资源泄露)
    3.一个局部域的多个对象,C++规定后定义的先析构。

代码演示:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;class Time
{
public://析构函数~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};class Date
{
public:
private:int _year;int _month;int _day;// 自定义类型Time _t;
};int main()
{Date a;return 0;
}

🏝️ 四、拷贝构造函数

  1. 概念:拷贝构造函数是通过一个对象来初始化另一个对象,也是一个特殊的构造函数。
  2. 特点:
    1.拷贝构造函数是构造函数的⼀个重载。
    2.拷贝构造函数的参数只有⼀个且必须是类类型对象的引用,使用传值方式是编译器会产生报错,因为在语法逻辑上会引发无穷递归。
    3.C++规定自定义类型对象在进行拷贝行为时必须调用拷贝构造。
  3. 注意事项:
    若未显式定义拷贝构造时,编译器会自动生成拷贝构造函数。而自动生成的拷贝构造对内置类型成员变量会完成值拷贝或浅拷贝(⼀个字节⼀个字节的拷贝),在对自定义类型成员变量时会调用它本身的拷贝构造。

代码演示:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1)// 构造函数{_year = year;_month = month;_day = day;}void Print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 7, 20);//用已存在的对象d1来初始化对象d2Date d2(d1); d1.Print();d2.Print();return 0;
}

🎄五、赋值运算符重载

  1. 定义:C++为了增强代码的可读性引入了运算符重载,允许我们通过运算符重载的形式来指定新的含义。

  2. 特点:
    1.运算符重载是具有特殊名字的函数,它的名字是由operator和后面要定义的运算符共同构成,具有其返回类型和参数列表以及函数体。
    2.运算符重载以后,其优先级和结合性与对应的内置类型运算符保持⼀致。

  3. 3.如果⼀个重载运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数比运算符对象少⼀个。

  4. 注意事项:
    1.不能通过连接语法中没有的符号来创建新的操作符:比如operator@。
    2.重载操作符至少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义。
    3.sizeof 、:: 、.* 、?: 、. 这5个运算符不能重载。
    4.重载++运算符时,有前置++和后置++,因此.C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,方便区分。
    5.重载<<和>>时,需要重载为全局函数,因为重载为成员函数时,this指针默认抢占了第⼀个形参位置,而第一个形参的位置为左侧运算符对象。而重载为全局函数时就可以把ostream/istream放到第⼀个形参位置。

🏠六、取地址运算符重载

取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数由编译器自动生成的就足够我们使用了,不需要额外去显式实现。

🎉const成员

  1. 定义:将const修饰的成员函数就称为const成员函数,const修饰成员函数放到成员函数参数列表的后面。

  2. 功能:const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

  3. 下面有这么几个问题:
    1.const成员能够调用非const成员的函数吗?
    2.非const成员可以调用const成员函数吗?
    3.const成员函数内可以调用其他的非const成员函数吗?
    4.非cosnt成员函数内可以调用其他的cosnt成员函数吗?

我们先来揭晓答案:
1.不可以 2.可以 3.不可以 4.可以

下面对上述问题进行阐释:
1.非const成员函数,即成员函数的this指针没有被const所修饰,当我们传入一个const修饰的对象时,被一个非const修饰的成员函数所接受,属于权限放大,因此函数调用失败。
2.const成员函数,即成员函数的this指针被const所修饰,当我们传入一个非const修饰的对象时,被一个const修饰的成员函数所接受,属于权限缩小,函数调用成功。
3…在一个被const所修饰的成员函数中调用其他没有被const所修饰的成员函数,属于权限的放大,因此函数调用失败。
4.在一个没有被const所修饰的成员函数中调用其他被const所修饰的成员函数,属于权限缩小,函数调用成功。

总结:权限可以被放大,但不能被缩小,否则就会出现报错。

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

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

相关文章

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划&#xff08;ERP&#xff09; 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理&#xff08;计划&#xff09;3.7.2.3 经营计划&#xff08;生产计划大纲&#xff09;3.7.2.4 …

C语言 | Leetcode C语言题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){int i 0;int j matrixColSize[0] - 1;while(j > 0 && i < matrixSize){if(target < matrix[i][j])j--;else if(target > matrix[…

ORBSLAM3 ORB_SLAM3 Ubuntu18.04 ROS Melodic 虚拟镜像 下载

build.sh 和 build_ros.sh编译结果截图&#xff1a; slam测试视频&#xff1a; orbslam3 ubuntu18.04 test 下载地址&#xff08;付费使用&#xff0c;不能接受请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/13YeJS4RGa3fBrG8BKfPbBw?pwds6vg 提…

python--实验15 数据分析与可视化

目录 知识点 1 数据分析概述 1.1流程 1.2定义 1.3数据分析常用工具 2 科学计算 2.1numpy 2.1.1定义 2.1.2创建数组的方式 2.1.3np.random的随机数函数 3 数据可视化 3.1定义 3.2基本思想 3.3Matplotlib库 3.3.1模块 4 数据分析 4.1Pandas 4.2数据结构 4.3基…

伪原创文章生成器软件,为你自动写作文章效率高

在当今快节奏的数字化时代&#xff0c;内容创作的需求如潮水般涌来。无论是博主们需要频繁更新的优质博文&#xff0c;还是企业宣传需要的大量文案&#xff0c;亦或是学者们的研究成果阐述&#xff0c;都对写作的效率提出了极高的要求。而就在这时&#xff0c;伪原创文章生成器…

软件测试点

案例&#xff1a; 需求&#xff1a; 动物品系&#xff1a;动物类型-动物品系体重&#xff1a;[1,无穷)年龄&#xff1a; 等价类&#xff1a;6个 界面测试&#xff1a; 默认值、颜色、布局动物品系下拉框&#xff0c;数据来源&#xff0c;排序规则 功能测试&#xff1a; …

Python游戏开发之制作捕鱼达人游戏-附源码

制作一个简单的“捕鱼达人”游戏可以使用Python结合图形界面库&#xff0c;比如Pygame。Pygame是一个流行的Python库&#xff0c;用于创建视频游戏&#xff0c;它提供了图形、声音等多媒体的支持。以下是一个基础的“捕鱼达人”游戏框架&#xff0c;包括玩家控制一个炮台来射击…

Java并发编程与高并发解决方案笔记

本课程将结合大量图示及代码演示&#xff0c;带你掌握多线程并发编程&#xff08;线程安全&#xff0c;线程调度&#xff0c;线程封闭&#xff0c;同步容器等&#xff09;与高并发处理思路与手段&#xff08;扩容&#xff0c;缓存&#xff0c;队列&#xff0c;拆分等&#xff0…

Linux—KVM虚拟化中(虚拟机克隆,快照,还原,删除)等应用实例

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

最优化理论与方法-第十讲-补充,鞍点与强对偶

文章目录 1. 原问题和对偶问题2. Slater 条件3. 鞍点 1. 原问题和对偶问题 用原问题(Primal Problem)中的P表示原问题&#xff0c;具体如下&#xff1a; ( P ) min ⁡ f ( x ) s t . g i ( x ) ≤ 0 , i 1 , ⋯ , m , h i ( x ) 0 , i 1 , ⋯ , l , x ∈ X \begin{equatio…

外部网络设计

外部网络设计 https://support.huawei.com/enterprise/zh/doc/EDOC1100368575/e64f745b#ZH-CN_TOPIC_0268148455 在Fabric网络的资源模型设计中&#xff0c;通过在Border节点创建外部网络&#xff0c;使得园区内部终端能够访问外部Internet等。Border上创建的每个外部网络资源…

【Zynq UltraScale+ RFSoC】~~~

Zynq UltraScale RFSoC 系列为 5G 无线和射频级模拟应用引入了颠覆性的集成和架构突破&#xff0c;可直接支持整个 5G sub-6GHz 频段。这个创新系列现已开始批量生产。此设计演示展示了多通道&#xff08;8T8R 或 16T16R&#xff09;Zynq UltraScale RFSoC 评估工具工具工具&am…

【芯片设计- RTL 数字逻辑设计入门 9.1 -- CRG模块】

请阅读【芯片设计 RTL 数字逻辑设计扫盲 】 转自&#xff1a;芯片设计基础 – CRG模块 文章目录 CRG模块CRG时钟系统CRG复位系统同步复位同步复位的优点同步复位的缺点 异步复位异步复位的优点异步复位的缺点 异步复位同步释放 CRG模块 CRG是芯片里的时钟和复位生成模块&#…

AIoTedge 智能边缘物联网平台

AIoTedge智能边缘物联网平台是一个创新的边云协同架构&#xff0c;它为智能设备和系统提供了强大的数据处理和智能决策能力。这个平台的核心优势在于其边云协同架构设计&#xff0c;它优化了数据处理速度&#xff0c;提高了系统的可靠性和灵活性&#xff0c;适用于多种场景&…

JVM-垃圾回收与内存分配

目录 垃圾收集器与内存分配策略 引用 对象的访问方式有哪些?&#xff08;句柄和直接指针&#xff09; Java的引用有哪些类型? 如何判断对象是否是垃圾? 请列举一些可作为GC Roots的对象? 对象头了解吗? mark word&#xff08;hashcode、分代、锁标志位&#xff09;、…

Vulnhub靶场DC-7练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. 获取用户名/密码2. ssh连接目标主机3. drush命令修改Drupal密码 0x03 漏洞查找与利用1. Drupal写入php木马2. 连接shell3. 反弹shell并提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-…

GitHub CLI 发布 2.53.0

gh 是 GitHub 官方的命令行客户端工具&#xff0c;在此推荐给每一位在参与、想参与到 GitHub 上开源项目的小伙伴。体验异常舒适&#xff01; 常用的命令包括有&#xff1a; 登陆认证 gh auth login克隆代码仓库 gh repo clone linuxsuren/api-testing创建 Fork 仓库 gh repo f…

机器学习基础入门(1)

最近也在努力的想要学习些机器学习的知识&#xff0c;目前正在了解各个概念及术语&#xff0c;下面就把学习到的概念都列出来。 人工智能 (AI) Artificial intelligence 人工智能生成内容&#xff08;AIGC&#xff09; 机器学习&#xff08;ML&#xff09; Machine Learning …

系统架构设计师教程 第3章 信息系统基础知识-3.6 办公自动化系统(OAS)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.6 办公自动化系统&#xff08;OAS&#xff09; 3.6.1 办公自动化系统的概念3.6.1.1 办公活动3.6.1.1 办公自动化的概念 3.6.2 办公自动化系统的功能3.6.2.1 事务处理3.6.2.1.1 单机系统3.6.2.1.2 多机系统 3.6.2.2 信息管理3.6.2.…

Windows tasklist命令详解,Windows查看进程

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 tasklist 可以…