访问”和“初始化本质区别以及C++静态成员变量定义位置详解
💡 1.访问”和“初始化本质区别:
- ✅ 访问
protectedNum:Derived作为Base的子类,是可以在自己的函数中访问protectedNum的。 - ❌ 初始化
protectedNum:只能通过Base的构造函数来初始化,因为它是Base拥有的成员,不是Derived的成员,Derived的初始化列表里不能直接初始化它。
📘 展开讲一讲:
🧱 protectedNum 是谁的成员?
它属于 Base 类:
class Base {
protected:int protectedNum;
};
🔍 能访问它吗?
是的,只要是在 Derived 类的成员函数里,就可以直接访问它,因为继承关系允许子类访问 protected 成员。
✅ 这就像你住在你爸的房子里,屋子里东西你可以随便用,但你不能在房子建好之前,自己去改它的结构。
❌ 为什么不能在 Derived 构造函数初始化列表里初始化 protectedNum?
这是因为:
- 初始化列表只允许你初始化你自己的成员变量;
- 而
protectedNum是Base的成员; - 所以你只能通过调用
Base的构造函数去初始化它。
你写的这句:
Derived(int num) : protectedNum(num) {}
相当于说:我不调用 Base 构造函数,我直接改你 Base 的东西 —— C++ 不允许这样。
✅ 正确方式是这样:
Derived(int num) : Base(num) {}或者直接赋值Derived(int num) {protectedNum = num;};
由 Base 自己初始化它的成员,你只是告诉 Base 你要传什么。
✍️ 类比打个比方:
你(Derived)住在爸妈家(Base),你可以用家里的冰箱(protected 成员),但盖房子(初始化)的时候得让你爸(Base 构造函数)去决定冰箱要不要装、装在哪里,你不能越权。
2.C++ 静态成员变量定义位置详解
一、普通类中的静态成员变量
1. 定义方式
class MyClass {
public:static MyClass instance;MyClass();~MyClass();
};
- 在头文件
.h中:这是声明 - 在源文件
.cpp中:必须提供定义
MyClass MyClass::instance;
2. 为什么要放 .cpp
- 头文件可能被多个
.cpp包含,如果在.h中定义,会导致多重定义 - C++ 需要在一个且只有一个地方定义并分配静态成员变量的内存
3. 总结
| 问题 | 答案 |
|---|---|
| 静态变量在类中声明是否自动定义? | 否 |
| 定义应放哪里? | .cpp |
可以放 .h 吗? | 不推荐,会造成链接错误 |
二、模板类中的静态成员变量
1. 定义方式
template <typename T>
class MyTemplate {
public:static int count;
};template <typename T>
int MyTemplate<T>::count = 0; // 必须放在 .h 文件中!
2. 为什么要放 .h
- 模板类不是提前编译好的,而是使用时编译器才生成代码(模板实例化)
- 每种类型的实例(例如
MyTemplate<int>、MyTemplate<double>)都是独立的类
- 每种类型的实例(例如
- 编译器在看到
MyTemplate<int>时,需要能立即看到静态成员的定义
3. 使用 inline 避免多重定义(C++17 起)
template <typename T>
inline int MyTemplate<T>::count = 0;
4. 总结
| 特性 | 普通类 | 模板类 |
|---|---|---|
| 是否提前确定 | 是 | 否(实例化时生成) |
| 静态变量定义放哪 | .cpp | .h |
| 多重定义风险 | 有 | 无,每个模板类型分开 |
| 推荐方式 | 类外定义一次 | 类内 + inline(C++17) |
三、类内初始化的例外:常量静态成员
可以在类内定义的情况:
static constexpr或static const int这类字面值常量:
class Config {
public:static const int MaxValue = 100; // OK
};
非 constexpr 类型(如 std::string)仍需类外定义:
class Config {
public:static const std::string name; // 声明
};// .cpp 中定义
const std::string Config::name = "App";
四、实践建议
- 🧠 普通类静态成员变量 ➜ 放
.cpp - 🧠 模板类静态成员变量 ➜ 放
.h,或加inline(C++17 起) - 🧠 所有类的静态成员 ➜ 不要忘记定义(否则链接失败)
相关文章:
访问”和“初始化本质区别以及C++静态成员变量定义位置详解
💡 1.访问”和“初始化本质区别: ✅ 访问 protectedNum:Derived 作为 Base 的子类,是可以在自己的函数中访问 protectedNum 的。❌ 初始化 protectedNum:只能通过 Base 的构造函数来初始化,因为它是 Base …...
正则表达式反向引用的综合应用魔法:从重复文本到简洁表达的蜕变
“我....我要....学学学学....编程 java!” —— 这类“重复唠叨”的文本是否让你在清洗数据时头疼不已? 本文将带你一步步掌握正则表达式中的反向引用技术,并结合 Java 实现一个中文文本去重与清洗的实用工具。 结合经典的结巴实例。如何高效地将这样的…...
C实现md5功能
md5在线验证: 在线MD5计算_ip33.com 代码如下: #include "md5.h" #include <string.h> #include "stdio.h"/** 32-bit integer manipulation macros (little endian)*/ #ifndef GET_ULONG_LE #define GET_ULONG_LE(n,b,i) …...
FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
基础(测试用例:介绍,测试用例格式,案例)
目录 测试用例介绍 测试用例编写格式 案例 测试用例介绍 用例:用户使用软件的案例场景 测试用例:是为测试项目而设计的测试执行文档 测试用例的作用: 防止漏测是实施测试的标准可以作为测试工作量的评估 测试用例编写格式 用例编号 用例…...
C++学习:六个月从基础到就业——内存管理:RAII原则
C学习:六个月从基础到就业——内存管理:RAII原则 本文是我C学习之旅系列的第十九篇技术文章,也是第二阶段"C进阶特性"的第四篇,主要介绍C中的RAII原则及其在资源管理中的应用。查看完整系列目录了解更多内容。 引言 在…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
bert项目解析
数据预处理 读取csv数据集 def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行# row每一行用英文逗号分割成列表[标签,文本] 所以标签和文本用英文逗…...
Linux `init` 相关命令的完整使用指南
Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别(Runlevel)详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式(Rescue Mode) 四、不同 Init 系统的兼容性1. Sy…...
【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba、Long Short Term Memory (LSTM)、xLSTM)
项目源码地址:https://github.com/ImagineAILab/ai-by-hand-excel.git 一、RNN 1. RNN 的核心思想 RNN 的设计初衷是处理序列数据(如时间序列、文本、语音),其核心特点是: 隐藏状态(Hidden Stateÿ…...
嵌入式音视频开发指南:从MPP框架到QT实战全解析
嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...
构建专业金融图表系统的高效路径——QtitanChart在金融行业的应用价值
QtitanChart是一个C 库,它代表一组控件,这些控件使您可以快速轻松地为应用程序提供漂亮而丰富的图表。QtitanChart在Qt.C 上实现,并且支持所有主要的桌面操作系统 - Windows、Linux和Mac OSX。要将QtitanChart添加到您的程序中,只…...
如何通过window端来ssh连接本地虚拟机的ubuntu
首先在 Ubuntu 虚拟机上安装和配置 SSH 服务: # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动,则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…...
问题:el-tree点击某节点的复选框由半选状态更改为全选状态以后,点击该节点展开,懒加载出来子节点数据以后,该节点又变为半选状态
具体问题场景: 用户点击父节点复选框将其从半选变为全选(此时子节点尚未加载)。 点击节点展开触发懒加载,加载子节点。 子节点加载后,组件重新计算父节点状态,发现并非所有子节点被选中,因此父节…...
【Rust 精进之路之第8篇-工具赋能】深入 Cargo:依赖管理、构建配置与工作空间 (Workspace)
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:超越构建,Cargo 是 Rust 生态的引擎 在我们的 Rust 学习之旅初期(第二篇),我们已经与 Cargo 有过初步的接触。我们学会了使用 cargo new 创建项目骨架,用 cargo build 编…...
多模态大语言模型arxiv论文略读(二十六)
Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题:Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者:Xinpeng Ding,…...
Java虚拟机(JVM)平台无关?相关?
计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。 Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。 目前使…...
Ubuntu 安装 Docker 教程(官方推荐方式)
✅ 步骤 1:卸载旧版本(如果有) for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ✅ 步骤 2:更新 APT 索引并安装依赖项bash sudo a…...
Win10 C盘空间不足清理方法
当Windows 10系统的C盘空间不足时,可以采取以下方法进行清理: 1. 清理临时文件 打开“设置” > “系统” > “存储”。 点击“临时文件”,勾选要删除的临时文件、系统缓存等,然后点击“删除文件”。 2. 使用磁盘清理工具…...
cloudstudio学习笔记之openwebui
代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…...
7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)
font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…...
机器学习核心算法全解析:从基础到进阶的 18 大算法模型
在机器学习领域,算法模型是解决实际问题的核心工具。 不同的算法适用于不同的数据场景和任务需求,理解它们的原理与应用是掌握机器学习的关键。 以下将详细解析 18 个核心算法模型,涵盖监督学习、无监督学习、集成学习和深度学习等多个领域…...
线性代数 | 知识点整理 Ref 1
注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 1。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…...
【深度学习入门_NLP自然语言处理】序章
本部分开始深度学习第二大部分NLP章节学习,找了好多资料,终于明确NLP的学习目标了,介于工作之余学习综合考量,还是决定以视频学习为主后期自主实践为主吧。 分享一个总图,其实在定位的时候很迷茫,单各章节…...
Windows常用维护命令
系统信息查询 systeminfo:查看系统详细信息,如操作系统版本、处理器信息、内存配置等。hostname:显示计算机名称。ver:显示 Windows 版本。 网络诊断 ipconfig:查看 IP 配置,如 IP 地址、子网掩码、网关等。…...
Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇
各位Java开发者们好!🚀 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主,今天我将带大家深入探索Java生态即将迎来的5大技术趋势,特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗ÿ…...
IcePlayer音乐播放器项目分析及学习指南
IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...
蓝桥杯 二进制问题 刷题笔记
8.二进制问题 - 蓝桥云课 存入N的二进制每一位作为基准数组 算出方案数 从高位往低位用dfs枚举每一位是放1还是放0 #include<iostream> #include<vector> #define ll long long using namespace std;ll dp[65][65]; ll num; ll k; vector<ll> vec;ll cal(l…...
20. git diff
基本概述 git diff的作用是:比较代码差异 基本用法 1.工作区 VS 暂存区 git diff [file]2.暂存区 VS 最新提交 git diff --staged [file] # 或 git diff --cached [file]3.工作区 VS 最新提交 git diff HEAD [file]高级用法 1.比较两个提交间的差异 git dif…...
