C++初阶学习第五弹——类与对象(下)——类与对象的收官战

news2024/12/28 3:25:24

 类与对象(上):C++初阶学习第三弹——类与对象(上)——初始类与对象-CSDN博客

类与对象(中):C++初阶学习第四弹——类与对象(中)——刨析类与对象的核心点-CSDN博客

前言:

在前面我们已经学习了C++类与对象的关键操作——默认成员函数,今天我们对之前的内容进行一些补充,同时再来学习几个新的知识点Static成员、友元和内部类

目录

一、构造函数进阶

1.1 构造函数的赋值化

1.2 构造函数的初始化

1.3 explicit关键字

二、static成员

三、友元

3.1 友元函数

3.2 友元类

四、内部类

五、总结


一、构造函数进阶

1.1 构造函数的赋值化

在前面,我们说对一个自定义类型的变量,当我们定义时可以通过构造函数默认初始化,操作如下:

class Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1();
	return 0;
}

实际上这样的操作并不叫作初始化,更确切的说应该叫赋值化,因为初始化只能有一次,而这个操作却可以多次赋值

比如:

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

这里就对_year进行了两次赋值,所以这个操作不能称之为初始化,而应该称之为赋值

1.2 构造函数的初始化

构造函数的初始化应该是这样一种形式:

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year),
		_month(month),
		_day(day)
	{

	}	
private:
	int _year;
	int _month;
	int _day;
};

有这样几个注意事项:

1、类中成员初始化时一定要按照它们声明的顺序来进行,尽量不要跳跃

2、每个成员只能在初始化列表中出现一次(初始化只能是一次)

3、类中包含以下成员,必须放在初始化列表位置进行初始化:

     ·  引用成员变量

     ·  const成员变量

     ·  自定义类型成员(且该类没有默认构造函数时)

上面提到的一定要注意对于引用成员变量、const成员变量、自定义类型成员一定要在初始化列表中进行初始化:

class A
{
public:
	A(int a)
		:_a(a)
	{}
private:
	int _a;
};
class B
{
public:
	B(int a, int ref)
		:_aobj(a)
		, _ref(ref)
		, _n(10)
	{}
private:
	A _aobj; // 没有默认构造函数
	int& _ref; // 引用
	const int _n; // const 
};

1.3 explicit关键字

对于接受单个参数的构造函数,不仅具有初始化的功能,还具有隐式转换的功能

下面这三种都属于只接受单个参数的:

1、构造函数只有一个参数

2、构造函数有多个参数,但是只有一个没有默认值

3、全缺省构造函数

class Date
{
public:
	// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用
	// explicit修饰构造函数,禁止类型转换---explicit去掉之后,代码可以通过编译
	explicit Date(int year)
		:_year(year)
	{}
	/*
	// 2. 虽然有多个参数,但是创建对象时后两个参数可以不传递,没有使用explicit修饰,具有类型转
   换作用
	// explicit修饰构造函数,禁止类型转换
	explicit Date(int year, int month = 1, int day = 1)
	: _year(year)
	, _month(month)
	, _day(day)
	{}
	*/
	Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};
void Test()
{
	Date d1(2022);
	// 用一个整形变量给日期类型对象赋值
	// 实际编译器背后会用2023构造一个无名对象,最后用无名对象给d1对象进行赋值
	d1 = 2023;
	// 将1屏蔽掉,2放开时则编译失败,因为explicit修饰构造函数,禁止了单参构造函数类型转换的作
//	用
}

二、static成员

static修饰的成员变量就是类中的静态成员变量,static修饰的成员函数就是静态成员函数

我们需要注意的是静态成员变量一定要在类外进行初始化

class A
{
private:
	static int _a;
};

//在类外对_a进行初始化
int A::_a = 0;

int main()
{
	return 0;
}

注意事项:

1、静态成员存放在静态区,为所有类成员共享

2、静态成员必须在类外定义(初始化),类中只是声明

3、静态成员访问方式:类名::静态成员或者对象.静态成员

三、友元

友元是一种突破类封装的一种方法,在特定的情况下使用会有意想不到的好处,但是类存在的意义就是进行封装,所以友元的使用会破坏耦合性,所以我们平时要尽量减少使用友元

友元有两种:友元类和友元函数

3.1 友元函数

对于一些函数而言,并不适合将它封装在类中,比如operator<<流输出函数

我们一般是这样用这个函数的:

int main()
{
	cout << d1 << endl;
	return 0;
}

而在将这个函数写在类中的时候,由于类中函数this指针默认的是第一个操作数(也就是左操作数),所以这样输出是不行的

需要这样才能保证:

int main()
{
	d1 << cout;
	//或者
	d1.cout;
	return 0;
}

但这样又违背常理,所以我们往往就需要在类外写一个全局函数来实现这个功能,但是在类外的话就不能直接访问类中的私有化成员,所以就有了友元函数的出现

友元函数实现上述功能的操作如下:

class Date
{
	friend ostream& operator<<(ostream& _cout, const Date& d);
	friend istream& operator>>(istream& _cin, Date& d);
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}

private:
	int _year;
	int _month;
	int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
	_cout << d._year << "-" << d._month << "-" << d._day;
	return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
	_cin >> d._year;
	_cin >> d._month;
	_cin >> d._day;
	return _cin;
}
int main()
{
	Date d;
	cin >> d;
	cout << d << endl;
	return 0;
}

3.2 友元类

友元类跟上面的友元函数很想,也是间接访问一个类中私有化成员的一种方法

比如一个时间类Time和一个日期类Date,我们就可以通过在时间类中声明日期类为时间类的友元类从而直接访问时间类中的私有成员变量

class Time
{
	friend class Date;     //声明Date为友元类
private:
	int _hour;
	int _min;
};
class Date
{
public:
	void test(int hour, int min)
	{
		_t._hour = hour;       //可以在Date类中直接引用Time类私有成员变量
		_t._min = min;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

四、内部类

如果一个类定义在另一个类的内部,那么这个类就叫做那个类的内部类

重点:

1、内部类和外部类实际上还是两个完全独立的类,完全可以将它们两个分开写

2、内部类是外部类的友元类,可以访问外部类的私有成员,但外部类不是内部类的友元类

3、内部类可以直接访问外部类的静态成员,不需要外部类的对象名或者类名

例如:

class A
{
public:
	class B
	{
	public:
		void Test(const A& a)
		{
			cout << k << endl;    //静态变量可以直接访问
			cout << a.h << endl;
		}
	};
private:
	static int k;
	int h;
};
int A::k = 1;
int main()
{
	A::B b;
	b.Test(A());
	return 0;
}

运行结果:

五、总结

以上就是C++类与对象的全部内容了,这三期基本就把类与对象所有知识点全部囊括了,如果有不理解的地方,欢迎在评论区中指出或者与我私信交流!!!

感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

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

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

相关文章

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量&#xff1a;探索Libevent的高性能I/O架构》&#xff0c;在这篇文章中&#xff0c;你将会学习到Libevent的高性能I/O原理以及应用&#xff0c;并且我会给出源码…

攻防世界-xff-referer

题目信息 分析过程 显示ip必须为123.123.123.123&#xff0c;则进行伪造 解题过程 打开repeator 提示必须来自https://www.google.com&#xff0c;则再次构造Referer 相关知识 x-forwarded-for 和 referer的区别: x-forwarded-for 用来证明ip的像是“127.0.0.1”这种&a…

为什么感觉没有效果

以前在辅导小儿作业的时候&#xff0c;我会在常用的搜索引擎里去寻找答案&#xff0c;一般情况下都能解决问题。 但是最近一段时间&#xff0c;我发现&#xff0c;搜索引擎搜出来的结果还没有利用短视频搜出来的答案更全面&#xff0c;短视频软件不仅可以显示AI整理出来的答案…

“先锋”西凤

执笔 | 文 清 编辑 | 古利特 制曲是酿酒的第一道工序&#xff0c;也是中国酿酒史上的一大创新&#xff0c;对白酒风味的影响至关重要。西凤酿酒人坚信“曲是酒之骨”&#xff0c;“曲”的品质决定酒的“骨气”&#xff0c;“酒曲”是酒体形成主题风味的基本定型元素和催化剂…

5分钟学会掼蛋

一、基本规则 1、用牌&#xff1a;总计108张&#xff0c;每人发牌27张。 2、牌型&#xff1a;八炸弹、七炸弹、六炸弹、五炸弹、四炸弹、天王炸、同花顺、顺子、钢板、三同张、三带二、单牌、对牌、三连对&#xff0c;注意掼蛋没有三带一的牌型。3、牌型大小&#xff1a;天王炸…

跟TED演讲学英文:What moral decisions should driverless cars make by Iyad Rahwan

What moral decisions should driverless cars make? Link: https://www.ted.com/talks/iyad_rahwan_what_moral_decisions_should_driverless_cars_make Speaker: Iyad Rahwan Date: September 2016 文章目录 What moral decisions should driverless cars make?Introduct…

electron 通信总结

默认开启上下文隔离的情况下 渲染进程调用主进程方法&#xff1a; 主进程 在 main.js 中&#xff0c; 使用 ipcMain.handle&#xff0c;添加要处理的主进程方法 const { ipcMain } require("electron"); 在 electron 中创建 preload.ts 文件&#xff0c;从 ele…

LangChain框架学习总结

目录 一、简介 二、概念 三、组件具体介绍 3.1 Models 3.1.1 LLMs 3.1.2 Chat Models 3.1.3 Text Embedding Modesl 3.1.4 总结 3.2 Prompts 3.2.1 LLM Prompt Template 3.2.1.1 自定义PromptTemplate 3.2.1.2 partial PromptTemplate 3.2.1.3 序列化PromptTemplat…

Python使用割圆法求π值

三国时期刘徽提出的割圆法有多牛掰&#xff0c;看这个&#xff1a;刘徽割圆术到底做了什么&#xff1f; - 知乎 用Python实现的该算法代码如下&#xff1a; #!/usr/bin/env python """使用割圆法计算π值Usage::$ python calc_circle_pi.py 20 # 参数20是迭代…

【Kubernetes系统与CKA(D)考试经验】

文章目录 应用程序部署模式的发展历程传统部署模式虚拟化部署模式容器部署模式容器部署模式的好处容器部署的弊端 容器编排Kubernetes网址Kubernetes架构互联网架构体系云原生&#xff08;微服务容器化Devops不可变基础设施&#xff09;Kubernetes架构Kubernetes组件 Kubernete…

【Docker】★★★

docker 的网络模式 ●host模式&#xff1a;使用 --nethost 指定 容器与宿主机共享网络命名空间、ip和端口 ●container模式&#xff1a;使用 --netcontainer:NAME_or_ID 指定 新建的容器共享已有容器的网络命名空间、ip和端口 ●none模式&#xff1a;使用 --netnone 指定 不进行…

数据结构——链表专题2

文章目录 一、返回倒数第k 个节点二、链表的回文结构三、相交链表 一、返回倒数第k 个节点 原题链接&#xff1a;返回倒数第k 个节点 利用快慢指针的方法&#xff1a;先让fast走k步&#xff0c;然后fast和slow一起走&#xff0c;直到fast为空&#xff0c;最后slow指向的结点就…

如何利用现货黄金避险功能来交易?

黄金自古以来就是投资者青睐的具有规避风险功能的投资品种&#xff0c;现货黄金作为以黄金为投资标的物的品种&#xff0c;自然也具备了规避风险的功能。如果出现了风险事件&#xff0c;避险情绪会为现货黄金带来颇为可观的行情&#xff0c;所以我们需要懂得如何利用现货黄金的…

智能AI摄像头项目

项目概要 硬件说明&#xff1a;易百纳rv1126 38板&#xff0c;易百纳GC2053摄像头&#xff0c;拓展版&#xff08;自绘&#xff09;&#xff0c;屏幕驱动板&#xff08;自绘&#xff09;&#xff0c;3.1inch mipi屏&#xff0c;FT5316触摸屏 开发环境 硬件分析 开发环境及sd…

代码随想录训练营31day-动态规划4

一、完全背包&#xff08;参考博客&#xff09; 和01背包区别在于物品可以无限次放入背包。完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 因此在需要在遍历顺序上进行区别&#xff0c;参考代码随想录&#xff1a; 二、518.零钱兑换II 题目求的是组…

光端机(2)——光纤通信学习笔记九

学习笔记里面只关注基本原理和概念&#xff0c;复杂的公式和推导都没有涉及 光端机 光发射机 作用&#xff1a;实现电光转换。将来自电端机的电信号对光源发出的光波进行调制&#xff0c;然后将调制好的光信号耦合到光线中传输。 基本性能要求 1.合适的发光波长&#xff08;光…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中&#xff0c;我们一起进行了FreeBSD RISCV 在QEME中实践 现在&#xff0c;让我们配置好网络吧&#xff01; 先上结论&#xff1a;用默认配置启动即可&#xff0c;网络就加载好了&#xff0c;只是不能ping罢了。因为不能ping&#xff0c;以为网络没通&#xff0…

如何使用ArcGIS Pro进行选房分析

无论是研究城市规划布局还是寻找理想的住房&#xff0c;都需要综合考虑购物、医疗、教育和休闲等多方面因素&#xff0c;此时我们的GIS软件就可以派上用场了&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 进行选房分析&#xff0c;希望能对你有所帮助。 数据来源 教程所…

【iOS】NSOperation、NSOperationQueue

文章目录 前言一、NSOperation、NSOperationQueue 简介二、NSOperation、NSOperationQueue 操作和操作队列三、NSOperation四、NSOperationQueue五、NSOperationQueue 控制串行执行、并发执行六、 NSOperation 操作依赖七、NSOperation 优先级八、NSOperation、NSOperationQueu…

概率论 科普

符号优先级 概率公式中一共有三种符号&#xff1a;分号 ; 、逗号 , 、竖线 | 。 ; 分号代表前后是两类东西&#xff0c;以概率P(x;θ)为例&#xff0c;分号前面是x样本&#xff0c;分号后边是模型参数。分号前的 表示的是这个式子用来预测分布的随机变量x&#xff0c;分号后的…