c++ 类和对象 —— 下 【复习总结】

1. 深入构造函数

1.1 函数体赋值

前文我们提到,创建对象时,编译器会调用构造函数给成员变量赋值。但这并不能称为对对象中成员变量的初始化。因为初始化只能初始化一次,但构造函数体内可以多次赋值。构造函数体中语句只能称为赋初值

那么,成员变量初始化的地方在哪里?我们不得不引入一个知识:初始化列表

1.2 初始化列表

初始化列表:冒号开始,接着是逗号分隔成员列表,每个“成员变量”后跟一个放括号中的初始值或表达式

class Date
{
private:int _year;int _month;int _day;public:Date(int year, int month, int day)//初始列表:_year(year),_month(month),_day(day)//函数体赋值{}
};

注意事项:

1. 每个成员变量在初始化列表最多出现一次(即只能初始化一次)

2. 类中包含:a.引用成员变量 b.const成员变量 c. 自定义成员函数(且该类没有默认构造函数)

(a 和 b 是因为要求在定义时必须初始化;c 是因为会自动调用它的默认构造函数)

3. 尽量使用初始化列表初始化,对于自定义类型成员变量,一定会先使用初始化列表初始化

4. 成员变量在类中声明次序是其在初始化列表中的初始化顺序,和它在初始化列表的先后次序无关

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

1.3 explicit关键字

对于接受单个参数的构造函数,还有类型转换的作用。

接受单个参数的构造函数:

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

2. 构造函数有多个参数,除第一个参数没默认值,其他参数都有默认值

3 .全缺省构造函数

但用explicit修饰构造函数,会禁止构造函数的隐式转换

class Date
{
private:int _year;int _month;int _day;
public://单参数构造函数,有类型转换的作用//用explicit修饰,禁止类型转换explicit Date(int year):_year(year){}//有两个缺省参数,相当于单个参数explicit Date(int year, int month=1, int day=1):_year(year),_month(month),_day(day){}
};

2. static成员

声明为static的类成员为类的静态成员,修饰成员变量称为静态成员变量;修饰成员函数称为静态成员函数。静态成员变量必须在类外初始化

特性:

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

2. 静态成员变量必须在类外定义,类中只是声明,定义不加static关键字

3. 静态成员用 类名::静态成员 或者 对象.静态成员 访问

4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员

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

3. 友元

友元可以突破类封装的限制。但友元会增加耦合度,破坏封装,不宜多用

友元:友元函数友元类

3.1 友元函数

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

注意事项:

1. 友元函数不是类的成员函数,只是可以访问类的私有和保护成员

2. 友元函数不能用const修饰

3. 友元函数可以在类定义的任何位置声明,不受访问限定符的限制

4. 一个函数可以是多个函数的友元函数

5. 友元函数的调用和普通函数调用相同

适用场景:

//如果想重载operator<<,但无法重载为类成员函数。
//this指针默认是第一个参数也就是左操作数了。
//但是实际使用中cout需要是第一个形参对象,所以要将operator << 重载成全局函数。
// 但类外没办法访问成员,此时就需要友元来解决。operator >> 同理
class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year = 2025, 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;
}

3.2 友元类

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

注意事项:

1. 友元关系单向,不具有交互性

2. 友元关系不能传递

3. 友元关系不能继承

class Time
{//声明日期类为时间类的友元类,在日期类中可以直接访问Time类的私有成员变量friend class Date;
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 = 2025, 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;
};

4. 内部类

一个类定义在另一个类的内部,这个内部的类就叫内部类。

它不属于外部类,不能通过外部类的对象去访问内部类的成员(外部类对内部类没有任何超越的访问权限),但内部类是外部类的友元类,内部类可以通过外部类对象参数访问外部类中所有成员。

注意事项:

1. 内部类可以定义在外部类的任意地方(如同友元)

2. 内部类可以直接访问外部类的static成员,不需要外部类的对象/类名

3. sizeof(外部类)= 外部类,相当于内部类不存储在外部类

class A
{
private:static int a;int b;
public:// B是A的友元class B{public:void fun(const A& i){//不用外部类的对象cout << a << endl;cout << i.b << endl;}};
};
int A::a = 1;

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

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

相关文章

【量化科普】Volatility,波动率

【量化科普】Volatility&#xff0c;波动率 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在金融市场中&#xff0c;波动率&#xff08;Volatility&#xff09;是衡量资产价格变动幅度的一个重要指标。它反映了资产价格的稳定性和风险水平。高波动率意味着资产价格…

PCIe(Peripheral Component Interconnect Express)详解

一、PCIe的定义与核心特性 PCIe&#xff08;外设组件互连高速总线&#xff09;是一种 高速串行点对点通信协议&#xff0c;用于连接计算机内部的高性能外设。它取代了传统的PCI、PCI-X和AGP总线&#xff0c;凭借其高带宽、低延迟和可扩展性&#xff0c;成为现代计算机系统的核…

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

目录 问题1 问题2 问题3 问题4 简单记录一下nacos2.0.3&#xff0c;编译打包的步骤&#xff0c;首先下载源码&#xff0c;免积分下载&#xff1a; nacos源码&#xff1a; https://download.csdn.net/download/fyihdg/90461118 protoc 安装包 https://download.csdn.net…

通过 TTL 识别操作系统的原理详解

TTL 的工作原理 TTL&#xff08;Time to Live&#xff0c;生存时间&#xff09;是网络中用于控制数据包生命周期的一个关键参数。它通过限制数据包在网络中可以经过的最大路由跳数&#xff08;或最大转发时间&#xff09;&#xff0c;确保数据包不会在网络中无休止地转发。TTL…

总结Solidity 的数据类型

数据类型 在 Solidity 中&#xff0c;类型系统非常丰富&#xff0c;主要分为 值类型&#xff08;Value Types&#xff09;和 引用类型&#xff08;Reference Types&#xff09;。此外&#xff0c;还有一些特殊类型和全局变量。 一.值类型 布尔型&#xff08;bool&#xff09…

Android audio(8)-native音频服务的启动与协作(audiopolicyservice和audioflinger)

音频策略的构建 1、概述 2、AudiopolicyService 2.1 任务 2.2 启动流程 2.2.1 加载audio_policy.conf&#xff08;xml&#xff09;配置文件 2.2.2 初始化各种音频流对应的音量调节点 2.2.3 加载audio policy硬件抽象库 2.2.4设置输出设备 ps:audiopatch流程简介 2.2.5打开输出设…

DeepSeek:从入门到精通

DeepSeek是什么&#xff1f; DeepSeek是一家专注通用人工智能&#xff08;AGI&#xff09;的中国科技公司&#xff0c;主攻大模型研发与应 用。DeepSeek-R1是其开源的推理模型&#xff0c;擅长处理复杂任务且可免费商用。 Deepseek可以做什么&#xff1f; 直接面向用户或者支持…

【一起来学kubernetes】17、Configmap使用详解

前言概述核心特性创建 ConfigMap使用 ConfigMap1. **环境变量**2. **Volume 挂载**3. **命令行参数** 更新与热重载Docker容器中Java服务使用Configmap**一、通过环境变量注入****步骤说明****示例配置** **二、通过 Volume 挂载配置文件****步骤说明****示例配置** **三、动态…

【八股文】从浏览器输入一个url到服务器的流程

1.url解析与DNS解析 浏览器解析用户输入的URL&#xff0c;提取协议&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路径等信息 浏览器首先检查本地DNS缓存和系统DNS缓存&#xff0c;若未命中&#xff0c;查询本地hosts文件 最后递归查询向本地DNS服务器发起请求&#xff…

网络空间安全(34)安全防御体系

前言 安全防御体系是一个多层次、多维度的系统&#xff0c;旨在保护组织或个人的信息资产免受各种网络攻击和威胁。 一、技术层面 网络边界防御 防火墙&#xff1a;部署在网络边界&#xff0c;通过设定规则允许或阻止特定流量的进出&#xff0c;保护内部网络不受外部攻击。入侵…

Linux 入门:权限的认识和学习

目录 一.shell命令以及运行原理 二.Linux权限的概念 1.Linux下两种用户 cannot open directory .: Permission denied 问题 2.Linux权限管理 1).是什么 2).为什么&#xff08;权限角色目标权限属性&#xff09; 3).文件访问者的分类&#xff08;角色&#xff09; 4).文…

【笔记】计算机网络——数据链路层

概述 链路是从一个结点到相邻结点的物理路线&#xff0c;数据链路则是在链路的基础上增加了一些必要的硬件和软件实现 数据链路层位于物理层和网络层之间&#xff0c;它的核心任务是在直接相连的节点&#xff08;如相邻的交换机&#xff0c;路由器&#xff09;之间提供可靠且…

ngx_url_t

定义在 src/core/ngx_inet.h typedef struct {ngx_str_t url;ngx_str_t host;ngx_str_t port_text;ngx_str_t uri;in_port_t port;in_port_t default_port;in_port_t …

搜广推校招面经五十四

美团推荐算法 一、手撕Transformer的位置编码 1.1. 位置编码的作用 Transformer 模型没有显式的序列信息&#xff08;如 RNN 的循环结构&#xff09;&#xff0c;因此需要通过位置编码&#xff08;Positional Encoding&#xff09;为输入序列中的每个位置添加位置信息。位置…

网络爬虫【爬虫库urllib】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 urllib介绍 Urllib是Python自带的标准库&#xff0c;无须安装&#xff0c;直接引用即可。 Urllib是一个收集几个模块来使用URL的软件包&#xff0c;大致具备以下功能。 ● urlli…

LabVIEW棉花穴播器排种自动监测系统

一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区&#xff0c;种植面积常年超250万公顷&#xff0c;传统人工播种存在两大核心问题&#xff1a; 效率瓶颈&#xff1a;人均日播种面积不足0.5公顷&#xff0c;难以匹配规模化种植需求&#xff1b; 精度缺陷&#xff1a;人…

解决diffusers加载stablediffusion模型,输入prompt总是报错token数超出clip最大长度限制

1. StableDiffusion1.5 在加载huggingface中的扩散模型时&#xff0c;输入prompt总是会被报错超过clip的最大长度限制。 解决方案&#xff1a;使用compel库 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…

jmeter配件元素

jmeter配件元素 CSV Data Set Config名词解释测试场景Recycle on EOF:False配置测试结果 Recycle on EOF:True配置测试结果 Sharing mode:All Threads配置测试结果 Sharing mode:Current thread group配置测试结果 Sharing mode:Current thread配置测试结果 HTTP Header Manage…

Navicat SqlServer 设置自增主键

Navicat是一款优秀的数据库管理工具&#xff0c;可以连接很多类型的数据库。使用它可以极大的提高工作效率。 Navicat 不能设置SqlServer自增字段&#xff0c;只能通过sql语句来实现 建表时设置 create table <表名> ( <字段1-主键> int identity (1,1) primar…

Elasticsearch搜索引擎 3(DSL)

Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;语句来定义查询条件&#xff0c;其JavaAPI就是在组织DSL条件。 1.DSL查询 叶子查询&#xff08;Leaf query clauses&#xff09;&#xff1a;在特定的字段里查询特定值&#xff0c;属于简单…