类的组合、作用域与可见性、类的静态成员、单例模式、
类的组合
一个类内嵌其他类的对象作为成员的情况
has - a组合
初始化列表的另一用途:为了调用数据成员的带参构造函数
能够层层递进

class Line
{
public:Line(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0);Line(const Line &other);~Line();Line(const Point &p1, const Point &p2);void showLine(void);
private:Point m_p1, m_p2;
};
Line::Line(int x1, int y1, int x2, int y2) : m_p1(x1, y1), m_p2(x2, y2)
{}Line::Line(const Line &other) : m_p1(other.m_p1), m_p2(other.m_p2)
{}Line::~Line()
{}Line::Line(const Point &p1, const Point &p2) : m_p1(p1), m_p2(p2)
{}void Line::showLine()
{m_p1.showPoint();cout << "->";m_p2.showPoint();cout << endl;
}
Line l1(1, 2, 3, 4);Line l2(l1);Point p1(5, 6);Point p2(7, 8);Line l3(p1, p2);l1.showLine();l2.showLine();l3.showLine();

前向引用声明
针对引用和指针
class A; //前向声明class B
{
public:void fn(A *a){} //或者 void fn(A &a){}};class A
{
public:void fn(B *b){} //或者 void fn(B &b){}
};
作用域
全局作用域 — 名称前面加两个冒号
匿名作用域(相当于c中的static) — 直接使用

作用域的关系

全局命名空间作用域,要访问时加上::
例::x
作用域可见性的一般规则如下:
1、标识符要声明在前,引用在后
2、在同一作用域中,不能声明同名的标识符
3、在没有互相包含关系的不同的作用域中声明的同名标识符,互不影响
4、如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见
生存期
静态生存期:对象的生存期与程序的运行期相同
全局变量(全局对象)
static修饰的静态局部变量:调用时创建,程序结束之后销毁
动态生存期:诞生于声明点,作用域结束时会被销毁
匿名对象生存期:
匿名对象:函数返回值为一个对象时,调用函数返回的对象就是匿名对象
为动态生存期,若是对匿名对象加名字(加常引用),匿名对象生存期将会被改变
const Clock &ref = Clock(11, 22, 33);
左值和右值
locatiable left value:能被取地址就是左值
readable right value:不能被取地址就是右值
所有的匿名对象都是右值而非左值
右值引用:希望能够使用匿名对象,起一个右值引用类型的别名
(给匿名对象起名字)
例:Clock &&ref = Clock(11, 22, 33);
类的静态成员
静态属性不为本类对象所特有的,而为本类所有对象所共有的属性
数据类型 类名 ::成员名

即类中的对象为声明,实际的对象是全局变量
静态对象函数:不需要使用对象.函数来调用,可以直接类名::函数来使用
静态数据成员:具有唯一性,对象有几个都没关系,这个成员在内存中只有一份
静态成员函数:不需要对象出现就能调用
在类的静态成员中不能访问类的非静态成员
在类的非静态成员中既可以访问类的非静态数据成员也可以访问类的静态数据成员
单例模式

#include <iostream>using namespace std;class Singleton
{
public:static Singleton *creat()//creat在没有对象的时候也能调用(类名::函数){if (m_p == NULL){m_p = new Singleton;//new:在堆上申请一个空间}return m_p;}static void destory(){delete m_p;//相当于freem_p = NULL;}
private:Singleton() {}static Singleton *m_p;//使得对象只能创建一个
};Singleton *Singleton::m_p = NULL;int main()
{Singleton *p, *q;p = Singleton::creat();q = Singleton::creat();//虽然分两次调用,但是调用的都是同一个东西,称为单例调用cout << p << endl;cout << q << endl;Singleton::destory();//类的使用者使用完之后调用销毁程序return 0;
}
使用counter验证是否为单例模式

#include <iostream>using namespace std;class Singleton
{
public:static Singleton *creat()//creat在没有对象的时候也能调用(类名::函数){if (m_p == NULL){m_p = new Singleton;//new:在堆上申请一个空间}return m_p;}static void destory(){delete m_p;//相当于freem_p = NULL;}static int getcounter(){return counter;}~Singleton(){--counter;}
private:Singleton(){++counter;}static Singleton *m_p;//使得对象只能创建一个static int counter;
};Singleton *Singleton::m_p = NULL;
int Singleton::counter = 0;int main()
{Singleton *p, *q;cout << Singleton::getcounter() << endl;p = Singleton::creat();q = Singleton::creat();//虽然分两次调用,但是调用的都是同一个东西,称为单例调用cout << Singleton::getcounter() << endl;cout << p << endl;cout << q << endl;Singleton::destory();//类的使用者使用完之后调用销毁程序cout << Singleton::getcounter() << endl;return 0;
}
类的友元函数 / 类
临时打破类的访问权限设置,从而在类外对类内的私有成员访问的机制
相关文章:
类的组合、作用域与可见性、类的静态成员、单例模式、
类的组合 一个类内嵌其他类的对象作为成员的情况 has - a组合 初始化列表的另一用途:为了调用数据成员的带参构造函数 能够层层递进 class Line { public:Line(int x1 0, int y1 0, int x2 0, int y2 0);Line(const Line &other);~Line();Line(const Po…...
高速公路定向广播(声光一体) HT-600D
1、产品概述: HT-600D声光一体平面波IP定向广播是北京恒星科通创新性研发产品,采用公司自主研发的平面波传声技术,该产品具有高声压、强指向性、高清晰度等特点,采用定向声传声技术将声音聚集到正前方定向传输,周边声压级明显降低…...
2024离婚新规已生效,不用等30天冷静期,线上开庭
2024年离婚必知的12条法律知识: ✅分居多久都不会自动离婚,想离婚,必需通过协议或起诉程序离婚 ✅婚后的工资收入,继承的遗产(未指定只给一人)都是夫妻共同财产 ✅没有领结婚证,或领证后没有共同生活&#…...
从零搭建python环境:深入解析虚拟环境与Python版本管理
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为何需要虚拟环境? 二、虚拟环境的创建与命名 1. 虚拟环境…...
windows安装官方正版notepad++
一 、notepad介绍 Notepad 是一个免费的、开源的文本编辑器,主要面向程序员和高级用户。以下是 Notepad 的特点: 跨平台: 虽然主要为 Windows 平台设计,但可以通过 Wine 在 Linux 和 macOS 上运行。 语法高亮: 自动识…...
netty-socketio 集群随记
实现netty-socketio集群的方式 代码实例 PostConstructpublic void subscribe() {pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {Overridepublic void onMessage(DispatchMessage message) {log.debug("subscribe: {}"…...
查看目录或文件的磁盘使用情况
在排查问题过程中,会遇到磁盘占满,需要排查具体哪个文件占用比较大,此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括: -h 或 --human-readable:以人类可读的格式(如 K、M、G)…...
如何选择合适的自动化框架
自动化测试框架的选型是一个复杂且重要的过程,需要考虑多个因素以确保所选框架能够满足项目的需求。以下是一些建议的步骤和考虑因素: 1. 明确项目需求: * 首先,要明确项目的测试需求,包括测试的类型(如…...
Java面试进阶指南:高级知识点问答精粹(二)
Java 面试问题及答案 1. 什么是Java内存模型(JMM)?它在并发编程中扮演什么角色? 答案: Java内存模型(JMM)是一个抽象的模型,它定义了Java程序中各种变量(线程共享变量&…...
thinkphp 使用模型实现多表连接查询
解决问题,多张表的查询连接问题,3张表及以上 爷爷表 有字段id 爸爸表 有字段id,grandfather_id 儿子表 id,parent_id 控制器中编写 public function getdata(){ $data model(爷爷表)->with([father.son])->select(); var_dump($data…...
LeetCode674:最长连续递增序列
题目描述 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l < i < r,都有 nums[i] < nums…...
Java技术精粹:高级面试问题与解答指南(一)
Java 面试问题及答案 问题1:请解释Java中的多态性,并给出一个例子。 答案: 多态性是Java中的一个重要特性,它允许一个引用类型可以指向多种实际类型的对象,并且可以通过这个引用调用实际对象的方法。多态性主要通过继…...
数据可视化技术头歌测试合集
努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰 目录 时间趋势可视化-柱形图 第1关:“大胃王”比赛数据柱形图绘制——绘制柱形图的基本步骤 任务描述 相关知识 观察和处理数据 绘…...
【linux-IMX6ULL-字符设备驱动简单框架实验】
目录 1. 字符设备驱动简介1.1 重要函数1.2 简单框架代码流程1.3 linux中关于驱动的重要命令 2. 字符设备驱动简单框架编写2.1 添加LICENSE信息2.2 驱动模块的入口与出口2.3 入口和出口函数的编写2.4 设备操作结构体定义2.4.1 结构体函数内容填充 3. 应用程序简介:4.…...
3D模型旋转显示不全怎么办---模大狮模型网
在3D建模和渲染过程中,我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成,包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法,帮助您解决3D模型旋转显示不全的问题。 一、检查模型…...
DLRover:蚂蚁集团开源的AI训练革命
在当前的深度学习领域,大规模训练作业面临着一系列挑战。首先,硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次,传统的检查点机制在大规模训练中效率低下,耗时长且容易降低训练的有效时间。资源管理的复杂性也给…...
ubuntu_概念
su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…...
Oracle递归查询笔记
目录 一、创建表结构和插入数据 二、查询所有子节点 三、查询所有父节点 四、查询指定节点的根节点 五、查询指定节点的递归路径 六、递归子类 七、递归父类 一、创建表结构和插入数据 CREATE TABLE "REGION" ( "ID" VARCHAR2(36) DEFAULT SYS_GUI…...
FaceFusion源码框架解读
FaceFusion源码框架解读 我的视频讲解:FaceFusion入门教学 FaceFusion官网 FaceFusion是一款开源的AI换脸工具,一款非常好用的换脸工具,操作简单,上手容易。 Facefusion:GitHub - facefusion/facefusion: Next gene…...
React项目知识积累(三)
1.primary-color 公共样式 less文件中的primary-color,会在config.js中的theme中统一写,方便统一更改。 config.js: theme{"primary-color":"#f0f0f0","font-size":"16px", }less: .classname{color:primary-…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
