【类和对象】③友元类

news2024/11/25 4:20:21

文章目录

  • 1.初始化列表
  • 2.static静态成员
  • 3.友元

在这里插入图片描述

1.初始化列表

我们知道在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。虽然调用构造函数之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

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

class Date
{
public:
	Date(int year, int month, int day)  //初始化列表
		: _year(year) 
		, _month(month) 
		, _day(day)
{}
private:
	int _year; 
	int _month; 
	int _day;
};

注意

  • 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
  • 类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量、const成员变量、自定义类型成员(且该类没有默认构造函数时)
  • 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
class A
{
public:
	A(int a)
	:_a1(a) 
	,_a2(_a1)
{}
void Print() 
{ 
	cout<<_a1<<" "<<_a2<<endl;
}
private:
	int _a2; 
	int _a1;
};
int main() 
{ 
	A aa(1);
	aa.Print();
}
A. 输出1  1
B.程序崩溃
C.编译不通过
D.输出1  随机值

选D选项,因为程序是先声明a2,所以在初始化列表里时先给a2初始化,此时a2(a1)中a1是随机值。

2.static静态成员

概念:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化 。

class A
{
public:
	A() 
{ 
	++_scount; 
} 
	A(const A& t) 
{ 
	++_scount; 
} 
	~A() 
{ 	
	--_scount; 
} 
static int GetACount() 
{ 
	return _scount; 
}
private:
	static int _scount;   //静态成员类里声明
};
	int A::_scount = 0; //静态成员类外初始化
void TestA()
{
	cout << A::GetACount() << endl; A a1, a2; A a3(a1); cout << A::GetACount() << endl;
}

静态成员特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,生命周期在整个程序运行期间,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

3.友元

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。友元分为:友元函数和友元类。

友元函数
问:现在尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数。因为cout的 输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成 全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。

  • 友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。

注意

  1. 友元函数可访问类的私有和保护成员,但友元函数不是类的成员函数
  2. 友元函数不能用const修饰
  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  4. 一个函数可以是多个类的友元函数
  5. 友元函数的调用与普通函数的调用原理相同

友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

  • 友元关系是单向的,不具有交换性。
  • 友元关系不能传递。
  • 友元关系不能继承,在继承位置再给大家详细介绍。
class Time
{
	friend class Date;   // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量
public:
	Time(int hour = 0, int minute = 0, int second = 0) 
	: _hour(hour) 
	, _minute(minute) 
	, _second(second)
{}
private:
	int _hour; 
	int _minute; 
	int _second;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1) 
	: _year(year) 
	, _month(month) 
	, _day(day)
{}
void SetTimeOfDate(int hour, int minute, int second)
{
// 直接访问时间类私有的成员变量
	_t._hour = hour; 
	_t._minute = minute; 
	_t._second = second;
}
private:
	int _year; 
	int _month; 
	int _day;
	Time _t;
};

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

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

相关文章

长胜证券:医药逐步走出疫情扰动 潜心静气迎接曙光

8月回顾&#xff1a;2023年8月医药生物板块跌落4.76%&#xff0c;同期沪深300跌落6.21%&#xff0c;医药板块跑赢沪深300约1.45%&#xff0c;位列31个子职业第11位。本月子板块医疗服务、中药、医药商业、化学制药、医疗器械、生物制品分别跌落1.47%、3.20%、3.97%、5.18%、7.2…

关于ChatGPT:4个维度讲透 ChatGPT 技术原理,揭开 ChatGPT 神秘技术黑盒!(文末送书福利5.0)

文章目录 &#x1f4cb;前言&#x1f3af;Tansformer架构模型&#x1f3af;ChatGPT原理&#x1f3af;提示学习与大模型能力的涌现&#x1f9e9;提示学习&#x1f9e9;上下文学习&#x1f9e9;思维链 &#x1f3af;行业参考建议&#xff08;关于本书&#xff09;&#x1f9e9;拥…

Python爬取天气数据并进行分析与预测

随着全球气候的不断变化&#xff0c;对于天气数据的获取、分析和预测显得越来越重要。本文将介绍如何使用Python编写一个简单而强大的天气数据爬虫&#xff0c;并结合相关库实现对历史和当前天气数据进行分析以及未来趋势预测。 1 、数据源选择 选择可靠丰富的公开API或网站作…

QT中闹钟的设置

.h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮 #include <QTextEdit> //文本 #include <QLabel> //标签 #include <QLineEdit> //行编辑器#include <QTimerEvent> //定时器事件类头文件 #…

串联系统与并联系统可靠性计算

串联系统 计算串联系统可靠性&#xff0c;就将所有部分的可靠性相乘即可 并联系统 计算并联系统可靠性&#xff0c;就用每个部分的不可靠性相乘&#xff0c;得到系统的不可靠性&#xff0c;再用1-不可靠性&#xff0c;得到并联系统可靠性 串&#xff0c;并联系统 上图的系统可…

深入剖析Kubernetes之控制器模式

文章目录 Kubernetes 项目中一个重要的设计思想&#xff1a;控制器模式。 nginx-deployment 的例子&#xff1a; apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:matchLabels:app: nginxreplicas: 2template:metadata:labels:app: ngin…

做外贸如何引导跟进客户

跟客户聊什么似乎是我们很多小伙伴很头疼的问题&#xff0c;尤其是需要跟客户follow-up 的时候&#xff0c;那种没话找话的感觉有时候都令自己抓狂。 如果我们自己的产品本身比较负责&#xff0c;设计到的工艺或者款式以及规格很多的时候&#xff0c;那可能话题就还容易一些&a…

初级电工电子基础知识部分

欢迎学习初级电工电子基础知识部分 学习可不能像是看小说那样看完就过了&#xff0c;作为电工学的开篇&#xff0c;同时作为电工技术这个特殊作业工种&#xff0c;理解并记住每个知识点是很重要的&#xff0c;因为电工基础里面很多都是理论知识&#xff0c;前面的没掌握好后面的…

算法基础-数学知识-质数、约数

这里写目录标题 质数试除法判定质数晒质数埃及筛线性筛 约数试除法求约数约数个数与约数之和AcWing 870. 约数个数AcWing 871. 约数之和 欧几里德求最大公因数 质数 埃及筛虽然用的不多&#xff0c;大多使用线性筛&#xff0c;但是埃及筛的思想很重要 试除法判定质数 AcWin…

大数据可视化大屏实战项目(4)物流数据云看台(包括动态登陆页面)—HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中)

大数据可视化大屏实战项目&#xff08;4&#xff09;物流数据云看台&#xff08;包括动态登陆页面&#xff09;—HTMLCSSJS【源码在文末】&#xff08;可用于比赛项目或者作业参考中&#x1f415;&#x1f415;&#x1f415;&#xff09; 一&#xff0c;项目概览 ☞☞☞☞☞☞…

软件测试案例 | 某教务管理平台系统的系统测试总结报告

集成测试通过之后&#xff0c;各个模块已经被组装成了一个完整的软件包&#xff0c;这时就需要进行系统测试了。传统的系统测试指的是通过集成测试的软件系统&#xff0c;作为计算机系统的一个重要组成部分&#xff0c;其将与计算机硬件、外部设备、支撑软件等其他系统元素组合…

信息安全性测试的流程

安全测试 一、信息安全性测试的定义 软件安全是一个广泛而复杂的主题&#xff0c;每一个新软件都可能存在安全的缺陷&#xff0c;甚至这个缺陷是前所未见的。信息安全性测试的目的在于通过系统的测试&#xff0c;对所测软件提出安全改进建议&#xff0c;帮助用户将风险控制/转…

图片转Excel表格神器的黑科技探索

哇塞&#xff0c;图片转Excel表格真的太酷了&#xff01;这种技术能让我们的图片信息变得井井有条&#xff0c;方便后续的数据分析和处理。想知道一般我们会用哪些技术来实现这个功能吗&#xff1f;以金鸣识别为例&#xff0c;让我们一起来聊聊吧&#xff01; 首先&#xff0c…

【ES6】Class中this指向

先上代码&#xff1a; 正常运行的代码&#xff1a; class Logger{printName(name kexuexiong){this.print(hello ${name});}print(text){console.log(text);} }const logger new Logger(); logger.printName("kexueixong xiong");输出&#xff1a; 单独调用函数p…

【PDF密码】没有密码,可以解密PDF文件吗?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。想要解密&#xff0c;我们需要输入正确的密码&#xff0c;但是有时候我们可能会出现忘记密码的情况&#xff0c;或者网上下载P…

Ubuntu tmux 默认安装 快捷键

安装 sudo apt install tmux 启动tmux tmux 注意下方已显示[0] 0:bash 左右分屏 依次输入两组快捷键&#xff1a;Ctrlb, Shift5 即:% 上下分屏 依次输入两组快捷键&#xff1a;Ctrlb, Shift 即:" 切换窗口&#xff08;注意&#xff1a;鼠标点击没有切换效果&#x…

如何快速成为一名优秀的python工程师?

随着人工智能的发展与应用&#xff0c;Python编程语言受到世界各界人士的关注&#xff0c;Python工程师也成为一个热门职业&#xff0c;就业薪资高&#xff0c;发展前景广阔。 Python是一门简单的编程语言&#xff0c;学习相对更加轻松容易&#xff0c;初学者很容易入门&#…

基于数据驱动的海表悬浮物浓度插值方法研究 - 以海洋遥感数据为例(多种方法;基于OI)

Data-Driven Interpolation of Sea Surface Suspended Concentrations Derived from Ocean Colour Remote Sensing Data 基于数据驱动的海表悬浮物浓度插值方法研究 - 以海洋遥感数据为例 Abstract 由于复杂的自然和人为相互作用的影响&#xff0c;海洋水柱中的悬浮沉积物动力…

离子平衡测试仪器的构成

离子风机的离子平衡测试仪器一般被称为离子平衡测试仪或离子计。离子平衡测试仪器主要用于测量离子风机产生的负离子和正离子的平衡状态。 离子平衡测试仪器通常采用电场法或电阻法进行测试。电场法是通过测量离子在电场中的运动来确定正负离子的平衡状态&#xff0c;而电阻法…

万里路,咫尺间:汽车与芯片的智能之遇

目前阶段&#xff0c;汽车产业有两个最闪耀的关键词&#xff0c;就是智能与低碳。 在践行双碳目标与产业智能化的大背景下&#xff0c;汽车已经成为了能源技术、交通技术、先进制造以及通信、数字化、智能化技术的融合体。汽车的产品形态与产业生态都在发生着前所未有的巨大变革…