C++入门五式——类和对象(下)
目录
再探构造函数——初始化列表
类型转换
static成员
友元函数
内部类
匿名对象
再探构造函数——初始化列表
-
之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表。
//初始化列表的使用方式
eg:time(int hour):_hour(hour)
//以一个冒号开始,以一个逗号分隔的数据成员列表,
//每个成员变量后面跟一个放在括号中的初始值或者表达式{cout<<_hour<<endl;}
- 每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。
- 引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化 ,否则编译报错。
#include<iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day):_year(year),_month(month),_day(day),a(1){//a = 1;报错}
private:int _year;int _month;int _day;const int a ;
};
- C++11支持在变量声明的地方给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。
#include<iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day):_month(month),_day(day) {}
private:int _year=2020;//给缺省值int _month;int _day;};
- 尽量使用初始化列表初始化,因为 “语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。 ”即使那些你不在初始化列表上初始化的成员也会走初始化列表。如果这个成员给了缺省值,就用缺省值。如果未给,那些你不在初始化列表上初始化的内置类型成员是否初始化看编译器。对于自定义则会调用默认构造函数,如果没有就报错。
- 初始化列表中按照成员变量在类中的声明顺序进行初始化,跟成员在初始化类表中出现的先后顺序无关。

初始化列表总结:
- 无论是否显示写初始化列表,每个构造函数都有初始化列表。
- 无论是否在初始化列表显示初始化成员变量,每个成员都要走初始化列表初始化。
类型转换
-
C++ 支持内置类型隐式类型转换成类类型对象,需要有相关内置类型为参数的构造函数。
#include<iostream>
using namespace std;
class A
{
public:A(int a):_a1(a){cout << "A" << endl;}int Get() const{return _a1;}
private:int _a1;};
class B
{
public:B(const A& a)//a这个对象使用const修饰,调用其函数Get也需要const修饰:_b1(a.Get()){}
private:int _b1;
};
int main()
{//1构造一个A的临时对象,再用这个临时对象拷贝构造给aa//当编译器遇到连续构造+拷贝拷贝构造时会直接优化成直接构造A aa1 = 1;const A& aa2 = 1;//C++11之后才支持多参数转化//A aa3 = { 1,2 };//aa1隐式转换成b对象,原理跟上面类似B b = aa1;const B& rb = aa2;return 0;
}
-
构造函数前面加上explicit就不再支持隐式类型转换
-
类类型的对象之间也可以隐式转换,需要相应的构造函数支持。
static成员
- 用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。
- 静态成员变量为所有类对象所共享,称之为静态成员函数,静态成员函数没有this指针。
- 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
- 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
- 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量和静态成员函数。
- 静态成员也是类的成员,受public,private,protected访问限制符的限制。
- 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。
#include<iostream>
using namespace std;
class A
{
public:A(){++scount;}A(const A& a){++scount;}~A(){--scount;}static int Getscount(){return scount;}
private:static int scount;
};
int A::scount = 10;
int main()
{cout <<A::Getscount() << endl;A a, a1;cout << A::Getscount() << endl;cout <<a1.Getscount() << endl;return 0;
}
友元函数
- 友元提供了一种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类声明的前面加friend,并且把友元声明放到一个类的里面。
- 外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,他不是类的成员。
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
- 一个函数可以是多个类的友元函数。
- 友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。
- 友元类的关系是单向的,不具有交换性,比如:A是B的友元,但B不是A的友元。
- 友元类关系不能传递,如果A是B的友元,B是C的友元,但是A不是C的友元。
- 又是提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
//友元函数
#include<iostream>
using namespace std;
//必须把B类放在A之前,否则A的友元函数不认识B
class B;
class A
{//友元声明friend void func(const A& aa,const B& bb);
private:int _a1 = 1;int _a2 = 2;
};
class B
{friend void func(const A& aa, const B& bb);
private:int _b1 = 3;int _b2 = 4;
};
void func(const A& aa, const B& bb)
{cout << aa._a1 << endl;cout << bb._b1 << endl;
}
int main()
{A aa;B bb;func(aa, bb);return 0;
}
//友元类
#include<iostream>
using namespace std;
class A
{friend class B;
private:int _a1 = 1;int _a2 = 2;
};
class B
{
public:void func(const A& aa){cout << aa._a1 << endl;cout << _b1 << endl;}
private:int _b1 = 3;int _b2 = 4;
};
int main()
{A aa;B bb;bb.func(aa);return 0;
}
内部类
- 如果一个类定义在一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,它只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。
- 内部类默认是外部类的友元类。
- 内部类本质也是一种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。
#include<iostream>
using namespace std;
class A
{
private:static int _k;int _h = 1;
public:class B//B默认是A的友元类{public:void foo(const A& a){cout << _k << endl;cout <<a._h << endl;}};
};
int A::_k = 1;
int main()
{A::B bb;A aa;bb.foo(aa);return 0;
}
匿名对象
- 用类型定义出来的对象叫做匿名对象,相比较我们之前的 类型 对象名(实参)定义出来的叫做有名对象。
- 匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象。
#include<iostream>
using namespace std;
class A
{
public:A(int a = 0)//构造函数:_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
class Solution
{
public:int s(int n){//....}
};
int main()
{A aa1;//A aa2();不能这样定义对象,因为编译器无法识别下面是一个函数声明还是对象定义。A();//匿名对象,不用取名字,生命周期只有一行,下一行自动调用析构return 0;
}
相关文章:
C++入门五式——类和对象(下)
目录 再探构造函数——初始化列表 类型转换 static成员 友元函数 内部类 匿名对象 再探构造函数——初始化列表 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表。 //初始化列…...
Spring的SPEL(Spring Expression Language)的使用说明,包含语法、示例和常见场景
以下是Spring的SPEL(Spring Expression Language)的使用说明,包含语法、示例和常见场景: 1. 基本语法 变量引用 表达式:#{变量名}(如#{systemProperties[os.name]})作用域:在Sprin…...
Linux应用:线程进阶
线程同步之信号量 信号量(Semaphore)是一个整型的计数器,用于控制对共享资源的访问。它通过 PV 操作来实现同步,P 操作将信号量的值减 1,如果值小于 0 则线程阻塞;V 操作将信号量的值加 1,如果…...
策略模式 (Strategy)
策略模式 (Strategy) 应用场景:用于处理不同的任务配置参数。在你的任务中,可能会有不同的任务类型,每个任务类型可能有不同的单位(比如米、毫米)或不同的处理方式。策略模式可以让你根据不同的任务类型选择不同的处理…...
【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet
主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: YOLOv8改进系列࿰…...
mathtype一些用法总结
1.一个是公式旁边加入||,一般使用键盘直接打入的会比较小,mathtype中的会好看很多,打开这个栏目,会看到有很多。 2.另外是带^符号,在字符上面带没有办法直接带,所以可以在mathtype中先加帽子,然…...
1、SQL注入攻击的防范
原文地址: SQL注入攻击的防范 更多内容请关注:代码安全 PHP安全编码——书写安全的代码 1、SQL注入攻击的防范 提问 问题1:什么是SQL注入攻击? 问题2:有几种简单方法防范SQL注入攻击? 问题3:mys…...
核心知识——论文总结
引入 本文我们会针对论文中的核心内容进行总结,加深小伙伴对于Spark的理解。而通过Spark的论文,重点需要掌握理解如下内容: Spark 里核心的 RDD 是一个什么概念,它是通过什么方式来优化分布式数据处理的,它的设计思路…...
HTTP 核心知识点整理
1. HTTP 基础 定义:HTTP(HyperText Transfer Protocol)是应用层协议,基于 请求-响应模型,用于客户端(浏览器)与服务器之间的通信。特点: 无状态:每次请求独立&a…...
什么是矩阵账号
矩阵账号是指在同一平台或多个平台上,围绕同一品牌或个人,创建的多个相互关联、协同工作的账号组合。这些账号虽然独立,但在内容定位和运营策略上有所区分,同时又相互引流,共同形成一个网络结构,类似于矩阵…...
【6】VS Code 新建上位机项目---项目分层
【6】VS Code 新建上位机项目---项目分层 1 项目分层(layer)2 项目分层实现数据插入SQL3 项目分层实现 (实体类封装参数)4 项目分层的实现SQL查询数据1 项目分层(layer) 表示层(UI):与用户交互使用。比如按钮,输入信息等;业务层(BLL):传递数据,业务逻辑。根据用户需…...
EspressoSample深度解析:在CircleCI上高效运行Android UI测试
项目背景与简介 EspressoSample项目位于GitHub上的circleci/EspressoSample仓库,该项目旨在展示如何在CircleCI平台上配置和使用Espresso进行Android应用的UI测试。 项目结构与环境准备 项目结构 EspressoSample项目遵循典型的Android项目结构,包含a…...
【每日论文】MetaSpatial: Reinforcing 3D Spatial Reasoning in VLMs for the Metaverse
下载PDF或查看论文,请点击: LlamaFactory - huggingface daily paper - 每日论文解读 | LlamaFactory | LlamaFactory探索LlamaFactory,为你解读AI前沿技术文章,快速掌握最新技术动态https://www.llamafactory.cn/daily-paper/de…...
mac m4 Homebrew安装MySQL 8.0
1.使用Homebrew安装MySQL8 在终端中输入以下命令来安装MySQL8: brew install mysql8.0 安装完成后,您可以通过以下命令来验证MySQL是否已成功安装: 2.配置mysql环境变量 find / -name mysql 2>/dev/null #找到mysql的安装位置 cd /op…...
Java关于多态
多态 字面意思:对象的多种形态。 Student(子类)<-Person(父类)->Teacher(子类) Student snew Student(); 学生形态 对象 代表用new创建一个学生对象赋值给Student 类型,代表Student类型(学生对象)现在是学生形态。 有了多态之后ÿ…...
K8S学习之基础四十六:k8s中部署Kibana
部署kibana组件 上传kibina镜像到harbor 部署kibana组件,包括svc和deplomentvi kibana.yaml apiVersion: v1 kind: Service metadata:name: kibananamespace: kube-logginglabels:app: kibana spec:ports:- port: 5601selector:app: kibana --- apiVersion: apps/…...
如何快速对比两个不同的excel文件中的单元格的数据是否完全相同 并把不同的单元格的背景颜色更改为红色?
要快速对比两个不同的Excel文件中的单元格数据是否完全相同,并将不同的单元格背景颜色更改为红色,可以使用Excel的以下几种方法: 方法一:使用条件格式 打开两个Excel文件。将一个文件的内容复制到另一个文件的新工作表中&#x…...
基于Python+LanceDB实战向量搜索
本篇实战演示向量搜索的实现和示例。 预期效果 给出一个查询的字符串,通过向量搜索,在下面三个语句中搜索出关联性最大的那句。 "熊猫是中国的国宝,主要栖息在四川山区。","长城是古代中国建造的军事防御工事,全…...
多路转接epoll
目录 一、为什么epoll最高效? 二、epoll的三个系统调用 三、理解epoll模型 四、epoll的优点 五、epoll的使用示例 六、epoll的工作模式 ET模式和LT模式的对比 七、epoll的使用场景 总结 一、为什么epoll最高效? 按照 man 手册的…...
AI编程工具哪家强?对比Cusor、Copilot、Cline
前言 AI最先革谁的命?刚毕业参加工作的那个时候就在想是否可以开发一个程序让它自己写代码,在那个遥远的年代,这种想法仿佛就是天方夜谭。但是今天大模型的出现让理想成为了现实。回答前面的问题,AI最先革谁的命,最聪…...
[FPGA基础学习]实现流水灯与按键暂停
FPGA实现LED流水灯 1.vscode的安装和使用 vscode下载 Visual Studio Code - Code Editing. Redefined vscode插件(Verilog-HDL/SystemVerilog)下载 quartus绑定vscode 2.用6个LED完成周期为1秒的跑马灯效果 流水灯模块设计 时钟输入 DE2-115开发板…...
刷题记录(LeetCode 994.腐烂的橘子)
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…...
ECharts折线图源码合集1(共18个自定义图表),附视频讲解与代码下载
引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我整理了18个自定义折线图图表,不仅对每个图表代码进行了精简优化,剥离冗余配置项,…...
SQL小菜之TOP N查找问题
前言 SQL的编写是后端面试中非常常见,其中TOP N查找问题也是高频出现的问题,今天我们来看两道SQL TOPN问题。 问题 我们有一张雇员表Employee: CREATE TABLE Employee (id int DEFAULT NULL,salary int DEFAULT NULL,department varchar(…...
蓝桥杯 临时抱佛脚 之 二分答案法与相关题目
二分答案法(利用二分法查找区间的左右端点) (1)估计 最终答案可能得范围 是什么 (2)分析 问题的答案 和 给定条件 之间的单调性,大部分时候只需要用到 自然智慧 (3)建…...
Css环形旋转立体感动画
Css环形旋转立体感动画 index.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Css环形旋转立体感动画</title><link rel"stylesheet" href"./style.css">&l…...
音乐极客指南:Melody高音质私有云音乐平台本地部署方案
文章目录 前言1. 添加镜像源2. 本地部署Melody3. 本地访问与使用演示4. 安装内网穿透5. 配置Melody公网地址6. 配置固定公网地址 前言 嘿,各位音乐爱好者们!今天我要带大家玩个大招——在香橙派Zero3上搭建你的专属在线音乐平台,还能通过cpo…...
Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·中】
🎀🎀🎀 microi-pageengine 界面引擎系列 🎀🎀🎀 一、Microi吾码:一款高效、灵活的低代码开发开源框架【低代码框架】 二、Vue3项目快速集成界面引擎 三、Vue3 界面设计插件 microi-pageengine …...
# WebSocket 与 Socket.IO 对比与优化
核心概念对比 WebSocket 协议性质:HTML5 提供的全双工通信协议 (RFC 6455)连接方式:基于 TCP 的低层协议通信模式:持久化连接,服务端可主动推送协议升级:通过 HTTP 101 状态码切换协议 Socket.IO 协议性质…...
vue3中,route4,获取当前页面路由的问题
首先应用场景如下: 在main.js里面,引入的是路由的配置文件,如下: import {router} from /router; app.use(router); 路由配置文件router.js如下: import { createRouter, createWebHistory } from vue-router; imp…...
python将整个txt文件写入excel的一个单元格?
要将整个txt文件写入Excel的一个单元格,可以使用Python的openpyxl库来实现。以下是一个简单的示例代码: from openpyxl import Workbook# 读取txt文件内容 with open(file.txt, r) as file:txt_content file.read()# 创建一个新的Excel工作簿 wb Work…...
日志2333
Pss-9 这一关考察的是时间盲注 先练习几个常见命令语句: select sleep(5);--延迟5s输出结果 if (1>0,ture,false);--输出‘ture’ /if (1<0,ture,false);--输出‘false’ select ascii()/select ord()返回字…...
用Deepseek写扫雷uniapp小游戏
扫雷作为Windows系统自带的经典小游戏,承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏,包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者,都能从本文中获得启发。 …...
C++中的异常和智能指针
一、C中的异常 1.1C语言中关于错误的处理(回顾) 1.1.1处理一:文件中的错误码,错误信息 C语言中,文件打开成功则返回地址,不成功返回0 FILE* foutfopen("Test.txt","r"); cout<&…...
Selenium 简单入门操作示例
最简单的 Selenium 示例(Python版) 下面是一个完整的、最简单的 Selenium 操作示例,带你快速上手: from selenium import webdriver from selenium.webdriver.common.by import By import time# 1. 启动浏览器(这里使…...
6.1 模拟专题:LeetCode 1576. 替换所有的问号
1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s,要求将所有 ? 替换为任意小写字母,使得替换后的字符串中 没有相邻的两个字符相同。 示例: 输入:s "?zs" →…...
前端知识点---用正则表达式判断邮箱(javascript)
// 全面的正则(兼容大多数情况) const emailRegex /^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$/;// 或直接使用浏览器内置验证 <input type"email" required>/:正则表达式的起始和结束标志。 ^:匹配字符串的…...
深度剖析 Spring 源码 性能优化:核心原理与最佳实践
深度剖析 Spring 源码 & 性能优化:核心原理与最佳实践 🚀 Spring 框架 作为 Java 生态的核心技术,广泛应用于企业级开发。但很多开发者只会“用”Spring,而不深入其内部原理,导致无法高效排查问题 & 进行性能优…...
Axure RP9教程 :轮播图(动态面板) | 头部锁定
文章目录 引言I 轮播图操作步骤在画布中添加一个动态面板设置面板状态II 头部锁定将头部区域选中,右键组合或用Ctrl+G快捷键;将组合的头部区域,右键创建动态面板;引言 动态面板的功能十分强大,比如:拥有独立的内部坐标系,有多个状态; Banner的案例中会用到动态面板多个…...
rabbitmq承接MES客户端服务器
文章目录 背景整体架构概述方案详细步骤1. 数据库选型与搭建2. 设备端数据上传至数据库3. 搭建 RabbitMQ 服务器4. 数据同步模块(数据库到 RabbitMQ)5. MES 服务器从 RabbitMQ 接收数据6. 指令接收模块(RabbitMQ 到设备端) 7. MES…...
重学vue3(三):vue3基本语法及使用
组合式 API是vue3 的核心特性,替代 Vue2 的选项式 API,强调逻辑复用和代码组织。基本语法如下: <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 响应式数据 const count ref(0); // 基本类…...
算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码
一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...
0322-数据库与前后端的连接、数据库表的增删改查
前端 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script srcjs/jquery-3.7.1.min.js></script> <script> //jquaryajax发起请求 //传参形式不同 post用data{}…...
详细介绍Qt中用于断言的宏 Q_ASSERT
Q_ASSERT 是 Qt 框架中用于调试的核心宏之一,其作用类似于标准 C/C 的 assert,但针对 Qt 的特性进行了优化。它用于在开发阶段验证程序的逻辑正确性,帮助开发者快速定位潜在的错误。 1.基本用法 Q_ASSERT(condition);功能:在调试…...
基于Python的自然语言处理系列(60):使用 LangChain 构建 Multi-Vector Retriever 进行文档检索
在 NLP 和 AI 领域,基于嵌入(Embeddings)进行文档检索已成为一种高效的解决方案。本文介绍如何使用 LangChain 构建 Multi-Vector Retriever,实现对长文档的分块索引和高效检索。 1. 环境准备 首先,我们需要安装相关…...
Dify 部署指南-离线版
Docker 部署 1、 访问 Docker 官网 (https://www.docker.com/) 获取安装包。 2、 上传 Docker 安装包 3、 进入解压目录,执行解压命令 tar xzvf docker-28、0.2、tgz4、 将解压文件中的 Docker 相关文件移动到 /usr/bin/ 目录 sudo cp docker/* /usr/bin/5、 创建…...
解决 Element UI 嵌套弹窗的状态管理问题!!!
解决 Element UI 嵌套弹窗的状态管理问题 🔧 问题描述 ❓ 在使用 Element UI 开发一个多层嵌套弹窗功能时,遇到了以下问题: 弹窗只能打开一次,第二次点击无法打开 🚫收到 Vue 警告:避免直接修改 prop 值…...
基于STM32单片机的智能手环/音乐播放/语音识别
基于STM32单片机的智能手环/音乐播放/语音识别 持续更新,欢迎关注!!! ** 基于STM32单片机的智能手环/音乐播放/语音识别 ** 21世纪,社会高速发展,生活物质越来越丰富,随着科技的进步,智能化成为了人们关注的焦点&am…...
NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台
目录 一、系统整体架构 二、移动端 APP 开发 2.1 开发环境与基础准备 2.2 主要功能模块 2.3 示例代码(Android/Kotlin 简化示例) 三、后台服务开发 3.1 环境准备 3.2 主要功能 3.3 示例代码(Node.js Express 简化示例) …...
使用 Python 开发 MCP Server 及 Inspector 工具详解
使用 Python 开发 MCP Server 及 Inspector 工具详解 前言 模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议,旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server,并详细讲解如何使…...