C++ static、const对象声明与定义 --续集--疑问?

C++ static与const用法详解 目录 static的作用: 对普通变量: 1.局部变量: 2.全局变量 对类中变量: 1.成员变量 2.成员函数 const的作用: static的作用: 对普通变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用... 阅读详情

昨天那个朋友告诉我处理const static的办法,程序却也跑起来了。但是昨晚睡觉的时候突然觉得不对头。看下面的代码:

int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;

这样的定义,不明显破坏了类的封装了么?而且main函数中TestClass::m_nvar++;这样的操作很明显就是可以破坏类封装的。看看类的定义:

class TestClass
{
public:
    TestClass();
    TestClass(int n);
    virtual ~TestClass(void);
    int m_ntestVar;
    static int m_nvar;
    const static int m_cnsta_var;
    static const int m_con_var ;
private:
public:
    int display(void);
};

看到static int m_nvar;他是static变量,可以在main还是操作?是的啊?他不是pubilc的么?这就更是完全有点恶搞了。是的,此处是public,要是我写成private呢。会如何?

class TestClass
{
public:
    TestClass();
    TestClass(int n);
    virtual ~TestClass(void);
private:
    int m_ntestVar;
    static int m_nvar;
    const static int m_cnsta_var;
    static const int m_con_var ;

public:
    int display(void);
};

错误信息:

1>Compiling...
1>demo_static.cpp
1>d:/documents/demo_static/demo_static.cpp(26) : error C2248: 'TestClass::m_nvar' : cannot access private member declared in class 'TestClass'
1>        d:/documents/demo_static/testclass.h(19) : see declaration of 'TestClass::m_nvar'
1>        d:/documents/demo_static/testclass.h(12) : see declaration of 'TestClass'

 

那么我改改main函数的内容:

再次编译,成功执行。

但是

int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;放到main函数所在的文件中,怕不是最好的,置于类实现中定然是可选的。尝试:

再次编译,一样成功。这样是类体定义的:

private:
    static int m_nvar;
    const static int m_cnsta_var;
    static const int m_con_var ;

static int m_nvar;不可在类体外访问(在main中操作失败了),保证的封装,而将

const static int m_cnsta_var;
    static const int m_con_var ;

放到main所在文件和类实现文件中,效果一样?但是保证了类的封装性,至少在我们对数据的透明上可以遮盖掉对数据内容的认知。

 

一文讲解 声明、定义、extern、static、const的区别联系?如何定义?放到.h还是.c? 声明和定义的区别 因为C++支持分离式编译,也就是将代码放到多个不同文件中,那为了在不同文件中使用相同的数据,就必须将声明和定义分离开。 首先,定义指的是为变量分配存储空间,真真正正地创造物理上的二进制代码。如下列代码 #include <iostream> using namespace std; int fc(){ //以下三行均为定义加声明 int i=0; int j=1; int k; //以下为赋值操作, i = 100; j = 5; 阅读详情

相关推荐

工程师必看:如何用功率谱密度搞定随机振动测试(附Grms计算实例)

本文为工程师详解如何通过功率谱密度(PSD)曲线计算Grms(总均方根加速度),从而量化随机振动测试的强度。文章拆解了平直谱、斜谱的计算公式,提供了完整的Grms计算实例,并指出了单位换算、对数坐标等常见工程陷阱,帮助工程师精准完成测试准备与设备推力评估。

3c4x5z6v7b的博客 625

C++ 类内常量定义 static const

在C++类内定义常量常用方式static const ,enum, 或const等形式。 static const : 在头文件中CTest类内声明如下: static const int SIZE = 10; // 类内声明,同时初始化,仅适用于整型变量,ints/chars/bools等, ...

u010272085的专栏 4306

卫星通信链路预算实战:从EIRP到Eb/N0的完整计算指南(含Excel模板)

本文提供了一份卫星通信链路预算的实战指南,详细解析了从EIRP到Eb/N0的完整计算流程。文章重点对比了C波段与Ku波段在应对降雨衰减等动态因素时的不同策略,并分享了包含核心公式的Excel模板,帮助工程师将理论转化为可执行的系统设计依据。

weixin_29230773的博客 534

C/C++:头文件与cpp文件的声明/定义

一、头文件 1、 一般来说,头文件仅仅用于声明,相应的定义要放在对应的cpp文件中。  声明的内容一般可以是:1. 类定义体;2.类中的成员方法; 3. 类外的函数; 4. 类外的变量;5. 类型。   一个文件(比如main.cpp)包含(#include)了一个头文件(比如item.h),就相当于声明了Item.h中声明的所有内容。 2、但是const常量,inline函数,static函数...

yongjunhe的专栏 5488

【补充:脑电绘图教程 2】如何手动去除ICA伪迹分量

ICA可以将脑电信号分解为多个IC分量,由每个分量的平均功率地形图可以看出哪些分量属于伪迹,去除伪迹分量后,即可得到“干净”的脑电信号。本教程主要总结如何人工识别出ICA伪迹分量,不涉及ICA的原理讲解。本教程的主要知识来源是ICLabel官网ICLabel致力于自动识别IC分量属于哪种伪迹,并标记伪迹占比,可以在eeglabel中很方便地使用。ICLabel给出了几种常见伪迹的特点,本教程主要是根据ICLabel给出伪迹特点,对自己的数据集手动去除伪迹,以更深入了解自己数据集的质量和伪迹特点。

qq_40735196的博客 4231

【Python_Zebra斑马打印机编程学习笔记(二)】基于BarTender将btw文件转换为zpl文件

本文介绍如何基于 BarTender 软件将 btw 格式的文件转换为 zpl 格式的文件,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 3376

static, const, static const 与 const static

1. static const/ const static, 意义一样 namespace NdpiTransformersTest { class TestMain { public: ~TestMain(); static int run(int argc, const char** argv); private: static ConfigMgmtDataTypes::Co...

wenmin_shu的专栏 1万+

8.26华为OD机试真题 新系统 - 字符串回文判 (Java/Py/C/C++/Js/Go)

8.26华为OD机试真题 新系统 - 字符串回文判 (Java/Py/C/C++/Js/Go)

算法大师! 1236

C/C++中const、static与宏定义对比

本文对比分析了C/C++中const、static和#define的特性差异。在C语言中,const仅表示只读变量,不具备编译时常量属性;static控制作用域和生命周期;#define是主要的常量机制。C++中const成为真正的编译时常量,static扩展了类内支持,#define主要用于宏替换。关键区别包括:C++的const默认内部链接、可作编译期常量,而C语言不具备这些特性;C++的static支持类成员。现代C++建议用const/constexpr替代宏,利用static管理类共享数据

弘羽 1310

基于ESP32的智能厨房控制系统开发

随着智能家居技术的发展,越来越多的家庭开始将传统的厨房设备进行智能化改造,以提高烹饪效率和生活质量。智能厨房控制系统是物联网(IoT)应用的重要组成部分,它将家居设备、传感器和网络结合起来,提供便捷的控制与监测功能,使厨房的烹饪过程更加智能、便捷和安全。基于ESP32的智能厨房控制系统不仅能够实现远程控制和监控,还能实现温度、湿度、烹饪状态的实时反馈,甚至具备智能化的推荐和自动化控制能力。ESP32是一款功能强大、集成度高的嵌入式开发平台,具有Wi-Fi和蓝牙双模通信能力,广泛应用于物联网设备的开发。

2201_76125393的博客 658

【Simulink教程案例9】基于simulink的BPSK,QPSK调制解调通信系统建模与仿真——使用simulink自带模块设计

BPSK (Binary Phase Shift Keying)-------二进制相移键控。是把模拟信号转换成数据值的转换方式之一,利用偏离相位的复数波浪组合来表现信息键控移相方式。BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。BPSK的映射关系如下所示:BPSK调制过程将输入的1010二进制数据中的0都转化为-1,使得非极性码变为极性码。

FPGA/MATLAB学习教程/源码/项目合作开发 3484

【C++】const和static的用法

本文介绍了C++中const与static关键字的用法及其结合应用。const主要用于限制变量/对象的可修改性,包括修饰普通变量、指针、函数参数/返回值、类成员和对象等场景。static则用于改变变量/函数的存储周期或作用域,包括修饰全局变量、局部变量以及类成员变量/函数。两者的结合应用主要体现在"类的静态常量"(static const)上,用于定义类级别的共享且不可修改的常量。文章通过具体代码示例详细说明了各种用法,帮助读者理解这两个关键字的正确使用方式。

2402_88461821的博客 1535

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++头文件中声明变量 const与static

背景 在平时写程序中,我们常常需要使用全局变量,但是如果在头文件(.h文件)中声明变量(非const常量)时,若有多个.cpp 文件include这个头文件时会出现多次定义的错误。 如在a.h文件中: // a.h 文件 #include<iostream> int a ; void f(); 在a.cc文件中: // a.cc 文件 #include "a.h" void f()...

Z1042300201的专栏 1852

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++头文件中定义static/const

温故知新! 网上查看到这篇文章,终结的很好,自己也修改了,这里记录一下: 背景 看到一个头文件,是专门定义各种常量的,有一天发现这里的常量定义既使用了static,又使用了const,这个文件没有类,全部都是字符串的定义 // QVNDefine.h #ifndef QVNDefine_h #define QVNDefine_h const string VN_LIST =...

zzhongcy的专栏 7914

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

const与static

const与static的理解

qq_61605392的博客 1914

C++中的const static this

前面我们说到了C++中的类创建,其中类包括了函数,变量,以及构造函数,但是和C语言当中一样,我们对变量和函数有const和static修饰,在C语言当中我们用const修饰变量表示不可修改的变量,那么在C++中是不是也是这样呢?明确告诉大家,有共同点也有不同点,大多是不同的

2301_78622258的博客 1385

C++ const 与 static 详解:变量、函数、类成员的全面解析

C++中的const和static关键字是控制变量行为和存储方式的核心工具。const用于声明不可变性,可修饰变量、函数参数和成员函数,保证数据不被意外修改;static则控制存储期和链接性,使局部变量持久化、限制全局变量作用域,并实现类成员的共享。两者结合可定义类级别的编译期常量(static constexpr)。使用时需注意const成员函数不能修改状态、static成员需在类外定义等规则,遵循优先使用constexpr、参数用const&等最佳实践,以提升代码安全性和性能。

保持分享欲 1232

C++中const 、static、 static const和const static的初始化以及修改问题

转载自  http://blog.bccn.net/zpcdbc/categories/119746 一、const、static、static const、const static变量的初始化 Ⅰ.const的初始化 (1)只有这一种情况const变量可以不在声明的同时定义,那就是const变量作为类的数据成员出现时。例如: class Myclass { cons in

bjyddxhfxq的博客 7149

C++中的 const和static 以及 static const 和const static

对于C/C++语言来讲,const就是只读的意思,只在声明中使用;static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见. const定义的常量在函数执行之后其空间会被释放,而static...

mhjie1998的博客 3216

关键字 extern static const, 声明和定义的区别

原帖 http://hi.baidu.com/bwandmff/blog/item/56876b30a31d519da9018e9a.htm在讨论全局变量之前我们先要明白几个基本的概念:1. 编译单元(模块):    在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的

DOS5GW的专栏 1421

C++之const和static的区别

const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。 在C++中,static静...

zyc2018的博客 4933

C++中声明与定义的区别

首先谈下声明与定义的区别。 声明是将一个名称引入程序。定义提供了一个实体在程序中的唯一描述。声明和定义有时是同时存在的。 如int a; extern int b=1; 只有当extern中不存在初始化式是才是声明。其他情况既是定义也是声明。 但是在下列情况下,声明仅仅是声明: 1:仅仅提供函数原型。如void func(int...

小白博客 1540

C++ const 和static 区别

const定义的常量在超出其作用域之后其空间会被释放。      在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。       const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的

freedom62的博客 5249
上一篇: C++ static、const对象声明与定义 --续集
下一篇: C++ static、const对象声明与定义 问题来源?
Qicz
博客等级 码龄16年 56粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值