类和对象的下篇

news2024/12/28 18:38:35

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: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);//err
	friend 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.coloradmin.cn/o/1564016.html

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

相关文章

从零实现一个Http服务器

HttpServer HTTPServer项目是一个基于C编写的简单的HTTP服务器实现&#xff0c;用于处理客户端的HTTP请求并提供相应的服务。该项目使用了Socket编程来实现服务器与客户端之间的通信&#xff0c;通过监听指定的端口并接受客户端连接&#xff0c;然后解析HTTP请求并生成对应的H…

新版Pubmed初识

PubMed基本检索操作指南。 PubMed和MEDLINE MEDLINE是美国国立医学图书馆&#xff08;The National Library of Medicine&#xff0c;NLM&#xff09;开发的国际性综合生物医学信息书目数据库&#xff0c;是当前国际上最权威的生物医学文献数据库。内容包括美国医学索引&…

通过提交容器的方式修改ubuntu镜像的apt源

通过提交容器的方式修改ubuntu镜像的apt源 步骤总结 问题&#xff0c;每次创建容器之后&#xff0c;都要在容器内手动更改镜像源。 不如&#xff0c;干脆修改镜像的apt源&#xff0c;一次到位。 步骤 先创建一个容器&#xff0c;到容器内执行变更命令。 D:/sandbox> dock…

Sora 基础作品之 DiT:Scalable Diffusion Models with Transformer

Paper name Scalable Diffusion Models with Transformers (DiT) Paper Reading Note Paper URL: https://arxiv.org/abs/2212.09748 Project URL: https://www.wpeebles.com/DiT.html Code URL: https://github.com/facebookresearch/DiT TL;DR 2022 年 UC Berkeley 出…

vue 移动端弹窗带滚动效果 滚动到底的时候弹窗下的页面会跟着滑动

<template><div class"wrap" :style"dynamicStyle"><!--dynamicStyle主要是介个 通过computed设置postion的值 弹窗的时候设置为fixed 关闭弹窗的时候设置为unset--><div class"banner-wrap"><img src"/assets/…

C语言一维数组及二维数组详解

引言&#xff1a; 小伙伴们&#xff0c;我发现我正文更新的有些慢&#xff0c;但相信我&#xff0c;每一篇文章真的都很用心在写的&#xff0c;哈哈&#xff0c;在本篇博客当中我们将详细讲解一下C语言中的数组知识&#xff0c;方便大家后续的使用&#xff0c;有不会的也可以当…

ArcGIS Pro打不开Excel?Microsoft驱动程序安装不上?

刚用ArcGIS pro的朋友们可能经常在打开xls或者xlsx文件的时候都会提示&#xff0c;未安装所需的Microsoft驱动程序。 怎么办呢&#xff1f;当然&#xff0c;按照提示装一下驱动就会好吗&#xff1f;有什么状况会出现&#xff1f;有什么临时替代方案呢&#xff1f; 全文目录&a…

ssm017网上花店设计+vue

网上花店的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关…

C++ 哈希思想应用:位图,布隆过滤器,哈希切分

C 哈希思想应用:位图,布隆过滤器,哈希切分 一.位图1.位图的概念1.问题2.分析3.位图的概念4.演示 2.位图的操作3.位图的实现1.char类型的数组2.int类型的数组3.解决一开始的问题位图开多大呢?小小补充验证 4.位图的应用1.给定100亿个整数&#xff0c;设计算法找到只出现一次的整…

【Redis】NoSQL之Redis的配置和优化

关系型数据库与非关系型数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系型模型&#xff08;二维表&#xff09;的基础上&#xff1b;一般面向于记录&#xff1b; SQL语句(标准数据查询语句)就是一种基于关系型数据库的语言&#xff0c;用于执行…

转圈游戏(acwing)

题目描述&#xff1a; n 个小伙伴&#xff08;编号从 0 到 n−1&#xff09;围坐一圈玩游戏。 按照顺时针方向给 n 个位置编号&#xff0c;从 0 到 n−1。 最初&#xff0c;第 0 号小伙伴在第 0 号位置&#xff0c;第 1 号小伙伴在第 1 号位置&#xff0c;…

FastAPI Web框架教程 第14章 部署

14-1 在Linux上安装Python 【环境】 腾讯云服务器 Centos 8 【安装方式】 源码编译安装 安装步骤&#xff1a; 第1步&#xff1a;更新yum源 cd /etc/yum.repos.d/ sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-* sed -i s|#baseurlhttp://mirror.centos.…

SV学习笔记(一)

SV&#xff1a;SystemVerilog 开启SV之路 数据类型 內建数据类型 四状态与双状态 &#xff1a; 四状态指0、1、X、Z&#xff0c;包括logic、integer、 reg、 wire。双状态指0、1&#xff0c;包括bit、byte、 shortint、int、longint。 有符号与无符号 &#xff1a; 有符号&am…

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程&#xff0c;笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC&#xff1a;Objective-C的简称&#xff0c;因为完整的名称过长&#xff0c;后续会经缩写来代替&#xff1b;项目/工程&#xff1a;也称工程&#xff0c;指的是一个A…

记某客户的一次无缝数据迁移

背景 客户需要将 Elasticsearch 集群无缝迁移到移动云&#xff0c;迁移过程要保证业务的最小停机时间。 实现方式 通过采用成熟的 INFINI 网关来进行数据的双写&#xff0c;在集群的切换恢复过程中来记录数据变更&#xff0c;待全量数据恢复之后再追平后面增量数据&#xff…

Node.js------Express

◆ 能够使用 express.static( ) 快 速 托 管 静 态 资 源◆ 能够使用 express 路 由 精 简 项 目 结 构◆ 能够使用常见的 express 中间件◆ 能够使用 express 创建API接口◆ 能够在 express 中启用cors跨域资源共享 一.初识Express 1.Express 简介 官方给出的概念&#xff…

Discuz! X3.5苗木_苗木网_苗木价格_苗木求购信息_苗木批发网模板utf-8

适合做苗木行业平台苗木网站、苗木信息网,提供苗木报价、各地苗木求购信息、绿化苗木采购招标、苗木基地展示、苗木百科知识、花木交易及苗木资讯、各地苗木信息网络行情。解压上传到template目录下&#xff0c;后台安装即可&#xff0c;包含PC手机端模板 下载地址&#xff1a;…

Windows 上路由、端口转发配置,跨网络地址段

一、背景 有时候我们会遇到这样的场景&#xff0c;一批同一局域网中只有某一台主机带外且系统为windows&#xff0c;局域网中其他非带外的主机要想访问外网&#xff0c;本文将介绍如何配置在带外主机上开启路由及端口转发。 二、配置操作 2.1、带外主机开启路由转发 1&#x…

QA测试开发工程师面试题满分问答6: 如何判断接口功能正常?从QA的角度设计测试用例

判断接口功能是否正常的方法之一是设计并执行相关的测试用例。下面是从测试QA的角度设计接口测试用例的一些建议&#xff0c;包括功能、边界、异常、链路、上下游和并发等方面&#xff1a; 通过综合考虑这些测试维度&#xff0c;并设计相应的测试用例&#xff0c;可以更全面地评…

一文盘点Mendix在SAP之上的那些事儿

前言 近来接手了2个与SAP有关的低代码案子&#xff0c;客户都会问Mendix和SAP之间怎么回事。 2017年开始Mendix 成为SAP Endorsed APP级别合作伙伴&#xff0c;并再度升级为Solution Extension最高级别。 两家公司风雨同舟七载&#xff0c;服务的全球大客户不胜枚举。 商业…