【C++】类和对象(5)
目录
- 一、构造函数补充
- 1、初始化列表
- 二、类型转换
- 三、static成员
- 四、友元
- 1、友元函数
- 2、友元类
- 五、内部类
- 六、匿名对象
一、构造函数补充
对于之前讲解的构造函数,还有一些更深层次的内容要进行补充,接下来进行补充内容的讲解。
1、初始化列表
在我们学习构造函数的时候想要去初始化成员变量主要是使用函数体内赋值,接下来我们要介绍另一种构造函数方式:初始化列表。
首先我们来看一段代码:
class Date{public:Date(int& x,int year = 1,int month = 1, int day = 1):_year(year),_month(month),_day(day){}
上面的代码展示了初始化列表的具体写法,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每一个“成员变量”后面跟一个放在括号中的初始值或表达式,可以写成一行也可以写成多行。
对于初始化列表,我们有几点需要注意:
1、每个成员变量在初始化列表中只能出现一次,我们可以认为初始化列表就是每个成员变量定义初始化的地方。
2、引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。
#include<iostream>using namespace std;class Time
{
public:Time(int hour):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};class Date
{
public:Date(int& x,int year = 1,int month = 1, int day = 1):_year(year),_month(month),_day(day),_t(12),_re(x),_n(1){}void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;Time _t;int& _re;const int _n;
};
int main()
{int i = 0;Date d1(i);d1.Print();return 0;
}
注意:
引⽤成员变量,const成员变量,没有默认构造的类类型变量(上面的代码中展现了),必须放在初始化列表位置进⾏初始化,否则会编译报错。

同时初始化列表和之前我们学的函数体内赋值也可以混着用。
C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤。

当我们不给缺省值时,对于没有显式在初始化列表初始化的内置类型成员是否初始化取决于编译器。
对于没有显式在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会报错。
C++规定:
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表,那些不在初始化列表初始化的成员变量也会走初始化列表,所以我们尽量写初始化列表。
二、类型转换
C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。
#include<iostream>using namespace std;class A{public:A(int a1):_a1(a1){}A(int a1, int a2):_a1(a1),_a2(a2){}void Print(){cout << _a1 << " " << _a2 << endl;}int Get() const{return _a1 + _a2;}
private:int _a1 = 1;int _a2 = 2;
};
class B
{
public:B(const A& a):_b(a,Get()){}
public:int _b = 0;
};
int main()
{A aa1 = 1;aa1.Print();const A& aa2 = 1;A aa3 = {2,2 };B b = aa3;const B& rb = aa3;return 0;}

隐式类型转换生成的是临时对象,临时对象具有常性,所以要加上const引用。
注意:
1、构造函数前面加explicit就不再支持隐式类型转换。
2、类类型的对象之间也可以隐式转换,需要相应的构造函数支持。
三、static成员
C++中的静态成员分为静态成员变量和静态成员函数,它们属于类本身而非类的实例,所有对象共享这些成员。
用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
注意:
1、初始化
class MyClass {
public:static int count; // 声明
};
int MyClass::count = 0; // 类外初始化
突破类域就可以访问静态成员,可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。
2、静态成员也是类的成员,受public、protected、private 访问限定符的限制。
class Secret {
private:static int key;
public:static int getKey() {return key;}
};
int Secret::key = 12345;
四、友元
在 C++ 中,友元(Friend) 是一种特殊的机制,允许一个类或函数访问另一个类的 私有(private) 和 保护(protected) 成员。友元打破了类的封装性,但为某些特殊场景提供了灵活性。
友元的分类:
友元分为:友元函数和友元类
友元的声明:
在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。
1、友元函数
作用:外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。
#include<iostream>using namespace std;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
}
例如在上面的代码中,func函数前面加了friend,那么这里func就是A的友元,func就可以访问A的成员。
注意:
1、友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。
2、⼀个函数可以是多个类的友元函数。
2、友元类
#include<iostream>
using namespace std;
class A
{friend class B;
private:int _a1 = 1;int _a2 = 2;
};
class B
{
public:
void func1(const A& aa)
{
cout << aa._a1 << endl;
cout << _b1 << endl;
}
void func2(const A& aa)
{cout << aa._a2 << endl;cout << _b2 << endl;}
private:int _b1 = 3;int _b2 = 4;
};
int main()
{
A aa;
B bb;
bb.func1(aa);
bb.func2(aa);
return 0;
}
注意:
1、友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。
2、友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。
3、友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。
五、内部类
如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类,内部类默认是外部类的友元类,内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。
六、匿名对象
⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。

匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象。
到这里类和对象的学习就算结束啦,大家多多支持哦!
相关文章:
【C++】类和对象(5)
目录 一、构造函数补充1、初始化列表 二、类型转换三、static成员四、友元1、友元函数2、友元类 五、内部类六、匿名对象 一、构造函数补充 对于之前讲解的构造函数,还有一些更深层次的内容要进行补充,接下来进行补充内容的讲解。 1、初始化列表 在我…...
FPGA|使用quartus II通过AS下载POF固件
1、将开发板设置到AS下载挡位,或者把下载线插入到AS端口 2、打开quartus II,选择Tools→Programmer→ Mode选择Active Serial Programming 3、点击左侧Add file…,选择 .pof 文件 →start 4、勾选program和verify(可选࿰…...
H. Mad City
题目链接:Problem - H - Codeforces 题目大意:给定一个带环的图, 以及a, b两点 判断再图上不断的移动, b想不与a相遇, a想捉到b, 并且二者只能移动一步。 若b跑不掉 NO 否则YES. 具体题目看链接 输入: …...
Nginx前端后端共用一个域名如何配置
在 Nginx 中配置前端和后端共用一个域名的情况,通常是通过路径或子路径将请求转发到不同的服务。以下是一个示例配置,假设: 前端静态文件在 /var/www/frontend/。 后端 API 服务运行在 http://127.0.0.1:5000。 域名是 example.comÿ…...
27.Word:财务软件应用的书稿【10】
目录 NO1.2 NO3 NO5.6 NO7.8 NO9 存在页码链接关系,只是页码格式不同 NO1.2 另存为/F12:考生文件夹布局→页面设置对话框→页边距:上下内外/装订线→纸张大小→布局:页眉页脚 NO3 样式的应用:超快速❗ 开…...
AI编程:如何编写提示词
这是小卷对AI编程工具学习的第2篇文章,今天讲讲如何编写AI编程的提示词,并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是:目标清晰明确,具有针对性,能引导模型理解问题 下面是两条提示词的对…...
记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)
文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机(基于 STM32CubeIDE GCC 开发),它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的,缺点是不支持…...
【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...
DeepSeek大模型技术深度解析:揭开Transformer架构的神秘面纱
摘要 DeepSeek大模型由北京深度求索人工智能基础技术研究有限公司开发,基于Transformer架构,具备卓越的自然语言理解和生成能力。该模型能够高效处理智能对话、文本生成和语义理解等复杂任务,标志着人工智能在自然语言处理领域的重大进展。 关…...
DeepSeek本地版安装简易教程(windows)
第一步:下载 第二步:安装 先安装ollama,安装完毕保持ollama运行,设置ollama通过防火墙,再安装deepseek,7b代表下载的r1版本,版本越高消耗资源越大 第三步:开放windows防火墙 第四步…...
RK3568使用QT搭建TCP服务器和客户端
文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…...
Python爬虫之——Cookie存储器
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 &…...
理解动手学深度学习的自编包d2l
跟着李沐的《动手学深度学习-PyTorch版》入门Python编程和Pytorch框架,以前是重度Matlab用户,对于Python里的各种包很不习惯。特别是,本书还自己做了一个名为d2l包,有几个问题很是困惑。今天终于弄明白了,写在这里&…...
大语言模型(LLM)模拟金融市场参与者行为
大语言模型(LLM)模拟金融市场参与者行为 研究背景 传统深度学习模型通过识别市场数据历史模式预测市场,但未捕捉个体决策过程。LLM 虽能学习人类对不同提示的反应,但在模拟金融市场参与者时面临挑战:个体投资者不总是理性决策,LLM 可能无法捕捉;LLM 数值和金融知识可靠…...
蓝桥杯刷题DAY1:前缀和
所谓刷题,讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了,我对你是有些失望的,进了这个营地,不是把事情做好就可以的,你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网,成为…...
Hive:窗口函数(1)
窗口函数 窗口函数OVER()用于定义一个窗口,该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上…...
OpenCV:SIFT关键点检测与描述子计算
目录 1. 什么是 SIFT? 2. SIFT 的核心步骤 2.1 尺度空间构建 2.2 关键点检测与精细化 2.3 方向分配 2.4 计算特征描述子 3. OpenCV SIFT API 介绍 3.1 cv2.SIFT_create() 3.2 sift.detect() 3.3 sift.compute() 3.4 sift.detectAndCompute() 4. SIFT 关…...
爬虫基础(一)HTTP协议 :请求与响应
前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议ÿ…...
视频拼接,拼接时长版本
目录 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg imageio,适合视频较短 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg import subprocess import glob import os from nats…...
【字符串两大注意事项】
表达字符串的方式 1.双引号:"hello world" 2.字符指针:char* ptr "hello world" 3.字符数组:char arr[] "hello world"辨析 项目表示方式代表含义内存分布1“hello world”字符串字面量字符串常量就是数据…...
【4Day创客实践入门教程】Day1 工具箱构建——开发环境的构建
Day1 工具箱构建——开发环境的构建 目录 Day1 工具箱构建——开发环境的构建1.元件选型2.准备工具3. 开发板准备焊接排针具体步骤注意事项与技巧 4. 软件环境配置与固件烧录Thonny IDE软件环境配置配置Micropython环境与烧录固件**问题:**买的是4M/16M,…...
如何让一个用户具备创建审批流程的权限
最近碰到一个问题,两个sandbox,照理用户的权限应该是一样的,结果开发环境里面我可以左右的做各种管理工作,但是使用change set上传后,另一个环境的同一个用户,没有相对于的权限,权限不足。 当时…...
Docker Hello World
Docker Hello World 引言 Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文将带领您从零开始,学习如何使用 Docker 运行一个简单的 "Hello World"…...
本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操
本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型,它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本,还可以处理图像等其他模态的信息。 模型主要特点:Permalink…...
ITS290F Human Computer Interaction
ITS290F Human Computer Interaction & User Experience Design Lab 1. Introduction to CodePen What you’ll learn in this lab: • Understanding CodePen • Creating a front-end page • Using Google form to submit your lab work CodePen is a cloud-based in…...
【详细教程】如何在Mac部署Deepseek R1?
DeepSeek是目前最火的国产大模型,官方App用户太多服务经常出现卡顿,部署一个本地DeepSeek R1可以方便使用。 1.系统最低要求 macOS 11 Big Sur 或更新 2.下载ollama https://ollama.com/ 3.安装DeepSeek R1 打开终端 运行命令 ollama run deepseek-…...
DeepSeek能下围棋吗?(续)
休息了一下,接着琢磨围棋,其实前面一篇里的规则有个漏洞的,就是邻居关系定义有问题,先回顾一下游戏规则: 游戏规则 定义: 1.数字对,是指两个1到9之间的整数组成的有序集合。可与记为(m,n)&…...
网络安全技术简介
网络安全技术简介 随着信息技术的迅猛发展,互联网已经成为人们日常生活和工作中不可或缺的一部分。与此同时,网络安全问题也日益凸显,成为全球关注的焦点。无论是个人隐私泄露、企业数据被盗取还是国家信息安全受到威胁,都与网络…...
Keepalived高可用集群企业应用实例一
一、实现master/slave的keepalived单主架构 1.master配置 global_defs { notification_email { 2676401238qq.com } notification_email_from keepalivedKA1.xiao.org smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ka1.xiao.org vrrp_skip_check_adv_addr vrr…...
愿景:做机器视觉行业的颠覆者
一个愿景,两场战斗,专注制胜。 一个愿景:做机器视觉行业的颠覆者。 我给自己创业,立一个大的愿景:做机器视觉行业的颠覆者。 两场战斗:无监督-大模型 上半场,无监督。2025-2030,共五…...
