c++高级---C++ 类中特殊的成员变量(常变量、引用、静态)

C++ 类与对象:深入理解成员变量、方法和访问控制 面向对象编程(OOP)是现代软件开发的核心范式之一,而C++作为一门支持多范式的编程语言,其对面向对象的支持尤为强大。本文将全面探讨C++中类与对象的概念,重点分析成员变量、成员方法以及访问控制机制,帮助读者构建扎实的面向对象编程基础。 阅读详情

转自:http://www.cnblogs.com/zhoug2020/archive/2012/08/31/2665451.html

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:

a.引用

b.常量

c.静态

d.静态常量(整型)

e.静态常量(非整型)

    常量和引用(本质还是对象的成员变量),必须通过参数列表进行初始化。
    静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。

参考下面的代码以及其中注释:
#include <iostream>
using namespace std;

class BClass
{
public:
 BClass() : i(1), ci(2), ri(i){} // 对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化
                                                //普通成员变量也可以放在函数体里,但是本质其实已不是初始化,而是一种普通的运算操作-->赋值运算,效率也低
private:
 int i;                                  // 普通成员变量
 const int ci;                           // 常量成员变量(只不过是只读的成员变量罢了)
 int &ri;                                // 引用成员变量
 static int si;                          // 静态成员变量
 //static int si2 = 100;                 // error: 只有静态常量成员变量,才可以这样初始化
 static const int csi;                   // 静态常量成员变量
 static const int csi2 = 100;            // 静态常量成员变量的初始化(Integral type)    (1)
 static const double csd;                // 静态常量成员变量(non-Integral type)
 //static const double csd2 = 99.9;      // error: 只有静态常量整型数据成员才可以在类中初始化
};

//注意下面三行:不能再带有static(静态变量要做类定义外初始化,但不能带static和访问权限修饰符,且只有初始化语句执行后才给静态变量分配内存)
int BClass::si = 0; // 静态成员变量的初始化(Integral type)
const int BClass::csi = 1; // 静态常量成员变量的初始化(Integral type)
const double BClass::csd = 99.9; // 静态常量成员变量的初始化(non-Integral type)

// 在初始化(1)中的csi2时,根据著名大师Stanley B.Lippman的说法下面这行是必须的。
// 但在VC2003中如果有下面一行将会产生错误,而在VC2005中,下面这行则可有可无,这个和编译器有关。
const int BClass::csi2;

int main()
{
     BClass b;
     return 0;
}

 

---------------------------------------------------------------------------------------------

静态成员属于类作用域,但不属于类对象,和普通的static变量一样,程序一运行就分配内存并初始化,生命周期和程序一致。
所以,在类的构造函数里初始化static变量显然是不合理的。
静态成员其实和全局变量地位是一样的,只不过编译器把它的使用限制在类作用域内(不是类对象,它不属于类对象成员),要在类的定义外(不是类作用域外)初始化。

总之:类中只有声明,没有定义,即没有能占内存的实体(但静态常量整形数据成员例外)。这样也是有原因的,要不然的话,还没有new一个对象之前,由于多个cpp文件都包含同一个头文件,即多个obj文件都包含同一个类的定义,就已经对同一个在类中定义的实体建立多次,且分配多个内存,显然不合理。

C++中变量赋值有几种形式 直接赋值和列表初始化是基础场景的常用方式,而拷贝/移动赋值、构造函数初始化则更多用于类对象或资源管理。Person(string n, int a) : name(n), age(a) {} // 构造函数初始化。// vec1的资源转移给vec2。Data& operator=(const Data& other) { // 赋值运算符重载。// 拷贝初始化obj1。// 调用构造函数赋值。使用 = 符号,但本质是通过拷贝构造函数完成赋值(适用于类对象)。// 等价于int b = 20; 阅读详情

相关推荐

金融风控实战:用Python从零搭建贷款违约预测模型(附完整数据集)

本文详细介绍了如何使用Python从零构建金融风控中的贷款违约预测模型,涵盖数据清洗、特征工程、模型构建与评估等全流程。通过实战案例展示逻辑回归、XGBoost和LightGBM三大算法的对比,特别强调AUC-ROC指标在金融风控中的重要性,并附完整数据集和代码实现。

weixin_29175469的博客 237

C++类的static(静态)成员

一、静态数据成员1.存储空间的分配定义类时分配空间,一般的数据成员依附于对象,定义类时不为其分配存储空间,只有定义对象时才分配存储空间。而静态数据成员不依附于任何特定对象,为所有对象所共有,不是定义对象时才分配存储空间,而是定义类时就为静态数据成员分配存储空间,供各对象所共享使用。2.在程序运行时始终存在对于静态数据成员,定义类时分配存储空间,程序结束时才收回分配的存储空间。3.只能在类外进行初始化

随机的未知——用已知去面对未知 1325

【密码学】生成8位26个字母和数字的全排列(密码字典,密钥)c++代码(非递归高效直接)

生成8位26个字母和数字的全排列(密钥)代码(非递归高效直接) 用C语言或C++,生成一个8位的26个字母和数字的全排列的原代码,例如从:00000000到ZZZZZZZZ。 说明:生成的这个字典会非常大,有36^8条记录,估计要3T的硬盘,跑一个晚上看看         这个方法比递归更高效,更直接。                                                ...

Wu_Being 的优快云 博客 1万+

C++类中的静态变量赋初值

C++类中的静态变量虽然默认为私有成员,但是由于它只占用固定的内存,所以可以直接调用赋以初值,代码如下所示。 class student { static int count; string name; string male; int age; int grade; public: student(string name, string male, int age, int grade) { count++; this->name = name; this->male

weixin_45021321的博客 5926

THB6128步进电机驱动芯片介绍

THB6128芯片也称为步进电机驱动芯片,采用BiCDMOS工艺,IC管脚间距为1mm的小型MFP30KR封装而成。

weichen_78的博客 7182

vscode+latex+bib文献管理

下载vscode 安装插件`` 在setting.json中配置 在.tex文件中编写论文内容,然后左侧TEX侧边栏中编译,如下图所示,中文用xelatex,英文用pdflatex;编译成功后,就可以查看pdf版本的论文了,我一般在浏览器显示。 涉及到文献编译:XXX.bib中存储文献管理内容;XXX.tex是文章内容,使用xelatex编译后会生成XXX.aux,ctrl+⋅ctrl+·ctrl+⋅打开命令行窗口,输入bibtex XXX(可以对aux文件进行编译,不需要加后缀),然后再xelatex.

小卜妞的博客 2545

C++之static,静态变量

static的详解 关于初始化、内存、优点、指针、释放时机等问题。静态局部变量在全局数据区分配内存,局部变量在栈区分配内存。

m0_59052131的博客 6904

工业级C#+YOLOv8缺陷检测系统:准确率98.5%、延迟<50ms的完整实现

本文分享了基于C#和YOLOv8的工业级表面缺陷检测系统实现方案。针对汽车零部件冲压件检测需求(60件/分钟,准确率>98%,延迟<100ms),作者对比了多种技术方案后选择了C#+YOLOv8+ONNX Runtime的组合,最终实现98.5%准确率和42ms延迟。 系统采用分层模块化架构,包含硬件层、采集层、推理层、业务层和控制层。核心优势包括:1)C#在工业环境下的稳定性和集成便利性;2)YOLOv8对复杂缺陷的泛化能力;3)ONNX Runtime GPU加速提升性能。文章详细介绍了硬件

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1138

C++ static详解

一 静态变量 1 全局静态变量 全局静态变量不具有链接性。在本文件中一直是可见的,但是在工程中其他文件中是不可见的。 #include using namespace std; void fn(); static int n; //静态全局变量在本文件中一直可见,但是在工程中的其他文件中是不可见的。 int main() { n=20; cout fn(); ret

zhaoxun91的博客 632

【人工智能】架构师必读:大模型时代的意图识别 (Intent Recognition) 四大技术流派与实践指南

意图识别没有“银弹”,选择哪种方案取决于具体的业务需求、数据积累以及成本预算。如果追求极简与低成本,BERT 是不二之选。如果业务极其复杂且依赖上下文,RAG 或 Agent 模式更合适。如果追求极致的稳定与效果,基于 LLM 的微调 + Function Calling 是目前的行业最佳实践。参考资源:基于 LLM 的意图识别解决方案(Embedding 相关课程章节)

奶爸的编程之路,也就一周冷个三天 701

由Sensor光谱响应曲线联想到的白平衡增益计算

由Sensor光谱响应曲线联想到的白平衡增益计算 由于传感器硬件的限制,传感器在某个预定波长范围内的响应不可能是100% 响应。现实中都是类似于正态分布的单峰函数。如果仅做粗略计算,由一个中心波长和半高宽(也成半波宽)完全可以由数学公式计算出一个高斯分布曲线。这个分布曲线就叫波谱响应函数。 波谱响应函数反映了传感器通道获取能量的情况。实际上每个传感器厂商都提供了具体的光谱响应函数,一般由两列数据组成,一列数据是波长,另一列数据是相对响应强度。下图某sensor光谱的响应的波谱响应函数。 ...

大熊 7487

C++ 类中特殊成员变量(常量、静态、引用)的初始化方法

有些成员变量的数据类型比较特别,它们的初始化方式和普通数据类型的成员变量有所不同。这些特殊类型的数据类型包括: 引用(&) 常量(const) 静态(static) 静态常量(static const) 整数类型(integral types:int、char、bool) 非整数类型 常量(const)和引用(&)必须通过过参数列表进行初始化; 静态成员变量的初始化有些特别,是在类外初始化且不能在带有 static 关键字; 带有类内初始值设定项的成员必须为常量(且为 int

一只攻城狮的博客 3299

单反相机物镜设计[DG-10]

REAR(要打在像面,操作数要找像面对应位置15):以透镜单位表示的真实光线径向坐标,波长由Wave定义,参见“Hx、Hy、Px和Py”。最小玻璃厚度最小不能小于semi-dia的1/10,要根据layout看有没有过厚过薄,反复调节。PROD:两个操作数的乘积(操作#1 X操作#2)。3x4就是57.3x0.41=23.5。拦光一般在第一面和最后一面操作,减少边缘无用光线。光阑面与镜面贴近,要调距离,同时设置光阑像差。后截距是指从镜头后表面到焦点的距离。CONS:弧度转为角度。镜头相互嵌入,有错误。

weixin_72050316的博客 600

C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

c++ 中定义引用变量时必须同时初始化,所以只能是int a=10;int &b=a;的形式出现。所以一直觉得c++的类中是不能有引用成员变量的。 最近才发现类中是可以有引用成员变量的,只是它的初始化相比一般的引用类型变量初始化特殊一点而已,不用定义的时候同时初始化。 有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:

nodeathphoenix的专栏 3226

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++类特殊成员变量(引用、静态、常成员变量)的初始化操作

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型)     常量和引用,必须通过参数列表进行初始化。     静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。 参考下面的代码以及其中注释:

鱼思故渊的专栏 1871

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++特殊成员变量(静态、常量、引用)的初始化方法

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括: 1.引用 2.常量 3.静态 4.静态常量(整型) 5.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化。 静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。 参考下面的代码以及其中注释

Invoker's Tower 2565

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C++】类内成员变量的初始化

C++11中,非静态常量、非静态变量、静态常量---可以在类内初始化。用=()或{}都可以。静态变量 ---不可以在类内初始化。非静态常量(const int)必须初始化。初始化列表可以对非静态常量和变量初始化。

m0_57168310的博客 5521

C++ 成员变量的初始化方法总结

有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引用,必须通过参数列表进行初始化。 静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字 参考下面的代码以及其中注释:

langminglang的博客 2333

【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)

💬 hello!各位铁子们大家好哇。今日更新了类与对象的构造函数、析构函数、拷贝构造函数、常引用的内容。

qinjh_的博客 3004
上一篇: c++高级---C++中的头文件和源文件(链接时怎么对应、头文件中能定义什么)
下一篇: c++设计模式:单件模式(Singleton Pattern)
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值