类和对象的下篇

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互相支持,蟹蟹!
👑👑👑💎👑👑👑 

 目录:
一:构造函数的补充
二:static修饰的变量以及函数
三:友元
四:内部类
五:匿名对象
六:拷贝对象的一些优化
七:深度理解封装

1:构造函数的补充
1.1初始化列表

类的成员里面有const 修饰的时候,我们在定义构造函数的时候,是有问题的,若不对当前const 修饰的变量进行初始化

const 修饰的变量必须在进行声明的时候就进行初始化

为解决这一问题,引出了初始化列表这个概念

对于自定义类型的成员,引用类型的成员并且对应的改类没有默认构造函数的,也需要借助 初始化列表来进行完成

1.2 注意:

     1:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
     2: 类中包含一些特殊的成员,必须放在初始化列表位置进行初始化

     3:不管是否显示在初始化列表中进行初始化,编译器都会默认在初始化列表中对所有是类的变量进行初始化

   4:初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

   5:当定义的对象给出了初始化的值,在调用初始化列表的时候就会以给出的参数进行初始化,若是没有给出参数,就看看是否有缺省值,有的话使用缺省值,若是2个都没有编译器就会使用随机值

栗子见下:

 6:关于在初始化列表里面对类的成员进行初始化的先后顺序问题:是以类的成员定义的先后顺序进行初始化的

栗子见下:

 1.3 explicit关键字

对于自定义类型与内内置类型之间的转换的理解:

当我们不想让自定义类型与内置类型之间进行转换 的时候可以使用关键字 explicit

2:static修饰的变量以及函数
2.1概念

类的成员在生命的时候使用关键字static进行修饰,称之为类的静态成员

static修饰的函数称之为静态成员函数

注意对静态成员变量一定要在类的外面进行初始化

 2.2应用

 

 2.3 static 的特性

1.静态成员为所有的类对象共享,不属于某一个对象,是放在静态区的

2.静态成员变量必须在类外进行定义,定义时不能加关键字 static

3. 类的静态成员的访问:类名 :: 静态成员变量名字 或者对象.静态成员变量

4.静态成员函数是没有隐藏的this指针

5.静态成员也是类的成员,也受到访问限定符的限制

6. 静态成员函数可以调用静态成员变量

7.静态成员函数可以调用静态成员函数

8.非静态成员函数可以调用静态成员函数

3:友元
3.1概念

友元其实是打破了对类的封装:当我们对类的成员属性设置为private或者protected的时候,在类是不能直接进行访问的,这个时候借助友元函数或者友元类进OK

3.2友元类

友元类是单向的,不能双向互相访问

代码:

class Time
{
private:int _hour;int _min;int _sec;
public:friend class Date;//声明日期为时间的友元类(也就是Date里面可以访问Timel里面的私有成员)Time(int hour = 0,int min = 0,int sec = 0):_hour(hour),_min(min),_sec(sec){}
};
class Date
{
public:void Print(){cout << _year << '/' << _month << '/' << _day << endl;cout << _t._hour << ':' << _t._min<< ':' << _t._sec << endl;}Date(int year = 2024, int month = 4, int day = 2)//初始化列表:_year(year), _month(month), _day(day){cout << "Date()" << endl;}void SetTimeOfDate(int hour, int min, int sec){_t._hour = hour;_t._min = min;_t._sec = sec;}
private:int _year;int _month;int _day;Time _t;//自定义类型
};
int main()
{Date d(2024, 4, 3);d.SetTimeOfDate(21, 31, 42);d.Print();return 0;
}

运行结果:

 

3.3友元函数
lass Date
{
public://friend ostream& operator << (ostream& _cout, Date& d);//errfriend ostream& operator<< (ostream& _cout,const  Date& d);friend istream& operator>> (istream& _cin,  Date& d);Date(int year, int month, int day)//初始化列表:_year(year), _month(month),_day(day){}void Print(){cout << _year << '/' << _month << '/' << _day << endl;}/*ostream& operator << (ostream& _cout){_cout << _year << '/' << _month << '/' << _day << endl;return _cout;}*/
private:int _year;int _month;int _day;};
ostream& operator<< (ostream& _cout,const Date& d)
{_cout << d._year << '/' << d._month << '/' << d._day << endl;return _cout;
}
istream& operator>> (istream& _cin, Date& d)//注意第二个参数不能用const 修饰
{//一开始是不能对类外私有成员进行访问的,可以借助友元函数进行操作_cin >> d._year >>d._month>>d._day;return _cin;
}
int main()
{Date d1(2024, 4, 2);//cout << d1 << endl;//err 此时this 指针和_cout这个参数都进行抢占第一个参数的位置cin >> d1;cout << d1 << endl;return 0;
}

 

注意:

  1.友元函数不是类的成员,不属于任何类
  2.友元函数不属于该类的成员函数,它是定义在类外的普通函数,只是类中声明该函数可以直接访问类中的private或者protected成员  

  3.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有声明。
  4.友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有声明。

4:内部类
概念: 如果一个类定义在另一个类的内部,这个内部类就叫做内部类 。内部类是一个独立的类,
它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越
的访问权限。
注意: 内部类是外部类的友元,但是外部类不一定就是内部类的友元 (看外部类是否进行友元的声明)

内部类的特点:

     1. 内部类可以定义在外部类的public、protected、private都是可以的。
    2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象 / 类名。
    3. sizeof(外部类) = 外部类,和内部类没有任何关系。 

     4. 内部类在空间上是与外部类相互独立的但是受到外部类的类域的限制

5:匿名对象

书写形式:类名 ()

6:拷贝对象的一些优化
在传参和传返回值的过程中,一般编译器会做一些优化, 减少对象的拷贝 ,以此提高效率

栗子见下:

7:深度理解封装
在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那的属性,以及方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化   具体的对象。
结语:

以上就是今日的share,对于类和对象下期的理解还是比较好容易的(当然是建立在前期:对类和对象上,中期的理解),希望各位老铁们可以有所收获!

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

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

相关文章

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里. 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:…

【漏洞复现】大华 DSS user_edit.action 信息泄露漏洞

0x01 产品简介 DSS是大华的大型监控管理应用平台&#xff0c;支持几乎所有涉及监控等方面的操作&#xff0c;支持多级跨平台联网等操作。 可将视频监控、卡口拍照、 区间测速 、电子地图、违章查询系统等诸多主流应用整合在一起&#xff0c;实现更加智能、便捷的分级查询服务。…

CPU设计实战-FPGA基础操作学习

目录 硬件调试方法 ILA&#xff08;监控内如何端口信号&#xff09;或VIO核&#xff08;不仅可以监控还可以驱动&#xff09;进行硬件调试 添加ILAIP核 实例化ILAIP核 使用ILA排查错误 另一个debug方法 仿真 代码固化&#xff08;即写入Flash中&#xff09; 方法一 方…

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集 卡码网46. 携带研究材料题目解法 416. 分割等和子集题目解法 感悟 卡码网46. 携带研究材料 题目 解法 题解链接 二维数组 # include <bits/stdc.h> using namespace std;int n, bagweig…

Jackson 2.x 系列【6】注解大全篇二

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 注解大全2.11 JsonValue2.12 JsonKey2.13 JsonAnySetter2.14 JsonAnyGetter2.15 …

WebKit揭秘:从内部结构到应用程序开发

文章目录 WebKit结构简介核心模块其他组件多进程架构&#xff08;WebKit2&#xff09; Wekbit做了什么&#xff1f;应用程序如何利用 Webkit WebKit结构简介 WebKit是一个开源的浏览器引擎&#xff0c;它由多个模块组成&#xff0c;这些模块协同工作以提供Web内容的渲染和交互…

189.轮转 数组

题目描述 解题思路 —————冒泡排序的超时算法—————— 1.k1 就是第一个元素不断向后一个元素调换位子&#xff0c;直到轮转到最后一个位置&#xff08;类似于冒泡排序&#xff0c;不断向后冒出&#xff09; 2.调用循环&#xff0c;当k>0的时候&#xff0c;不断向…

web有哪些方式可以实时更新数据

在Web开发中&#xff0c;有几种方式可以实现数据的实时更新&#xff0c;以确保用户界面能够及时反映后端数据的变化。 以下是一些常用的实现实时数据更新的技术&#xff1a; 一. AJAX轮询&#xff08;Polling&#xff09; 轮询是一种通过定时发送HTTP请求到服务器来检查数据…

【2024最新】vue3的基本使用(超详细)

一、Vue 3 概述 1. 为什么要学习Vue 3 Vue 3是Vue.js的最新主要版本&#xff0c;它带来了许多改进和新特性&#xff0c;包括但不限于&#xff1a; 性能提升&#xff1a;Vue 3提供了更快的渲染速度和更低的内存使用率。Composition API&#xff1a;引入了一个新的API&#xf…

英伟达智算先锋训练,冲刺智算时代实战

随着数字经济的深入发展&#xff0c;智能算力作为关键生产力&#xff0c;其规模在2022年已达到268.0 EFLOPS&#xff0c;并预计到2028年将增长至2769 EFLOPS&#xff0c;显示出强劲的发展势头。在2024年政府工作报告中&#xff0c;也首次提出了“人工智能”行动&#xff0c;强调…

baseDao增删改查.

这里写目录标题 1、baseDao增删改查介绍2、basDao类3、BasDao类的作用 1、baseDao增删改查介绍 (1)、增加Create&#xff09;操作&#xff1a; 通过BaseDao的insert方法可以向数据库中插入一条新的记录。 该方法接受一个实体对象作参数&#xff0c;将该对象的属性映射到表的字…

Python轻量级框架Flask开发web应用(附源码自取)

目录 介绍 安装 简单初使用 新建项目目录 视图映射 无参映射 带参映射 ? 传参映射 连接mysql orm对象视图映射建表 ​编辑 crud操作 新增操作 查询操作 普通查询 查询返回json数据 前端传递json体数据查询 更新操作 删除操作 orm表关系映射 flask-migrate迁…

【Vue】vue3简介与环境配置

文章目录 项目编码规范什么是 Vue&#xff1f;安装node环境nvm针对node版本惊醒管理的工具 项目编码规范 组合式API Typescript setup(语法糖) 什么是 Vue&#xff1f; Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;…

JavaBean是什么?

Bean的本意为豌豆、子实&#xff0c;在这里引申为一种实体。JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性&#xff0…

951. 翻转等价二叉树

跳转题目 判断两棵树是否为反转关系。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr)…

操作系统高频面试知识总结 part1

操作系统 1.什么是操作系统&#xff1f;2.并发与并行&#xff1f;3.同步与异步&#xff1f;4.阻塞和非阻塞&#xff1f;5.什么是进程&#xff1f;6.什么是线程&#xff1f;7.进程与线程的区别&#xff1f;8.进程地址空间&#xff1f;9.进程常见状态&#xff1f;10.进程间通信&a…

Google人才选拔的独特视角

Google人才选拔的独特视角 独特的人才选拔标准 Google作为全球最大的搜索引擎公司&#xff0c;拥有无数优秀的人才。他们的选拔标准与众不同&#xff0c;有着自己独特的人才观。 重视多元化的背景 Google相信人才的多元化背景能够给公司带来不同的思考角度和创新思维。他们…

【总结】在嵌入式设备上可以离线运行的LLM--Llama

文章目录 Llama 简介运用另一种&#xff1a;MLC-LLM 一个令人沮丧的结论在资源受限的嵌入式设备上无法运行LLM&#xff08;大语言模型&#xff09;。 一丝曙光&#xff1a;tinyLlama-1.1b&#xff08;10亿参数&#xff0c;需要至少2.98GB的RAM&#xff09; Llama 简介 LLaMA…

Java language programming:作品评分系统

题目&#xff1a; 全国中小学生Scratch作品大赛拉开了序幕。每个参赛选手可以通过网络直接上传作品。本次比赛人人可做评委。每个网络评委可以通过网络对每一件作品进行打分。其自动去掉一个最高分和一个最低分&#xff0c;求出平均分。 输入格式: 输入数据包括两行: 第一行为…

电商技术揭秘四:电商平台的物流管理系统

文章目录 引言一、物流管理系统的功能与架构1.1 物流管理系统在电商平台中的作用概述保障订单的及时配送优化库存管理控制运营成本提升客户服务水平支持数据驱动的决策应对市场变化 1.2 订单处理功能分析自动化处理流程订单分配与履行错误检测与处理机制实时订单状态更新订单数…