【c++】static和const修饰类的成员变量或成员函数

news/2024/11/8 0:50:58/

目录

1、静态成员变量

2、静态成员函数

3、常函数

4、常对象


当我们使用c++的关键字static修饰类中的成员变量和成员函数的时候,此时的成员变量和成员函数被称为静态成员。

静态成员包含:

  • 静态成员变量
  • 静态成员函数

1、静态成员变量

静态成员变量有着如下几个特点:

  1. 所有对象共享一份数据
  2. 在编译阶段分配内存
  3. 类内声明,类外初始化

需要我们牢记的是,空类的内存空间大小为1,是为了每个空类对象一个独一无二的地址。

当我们在类内声明静态成员变量之后,需要在类外定义静态成员变量:

int Data::m_varA = 10;
int Data::m_varB = 10;

定义多个类对象,打印出不同类对象的同一个静态成员变量,可以很明显看出结论:类对象共享静态成员变量的同一份数据

 对于私有权限下的静态成员变量m_varB,发现在类的外部是无法访问的:

 这说明了:静态成员变量也是有访问权限的。

由于静态成员变量是在编译期间分配的,那么可以不可以通过类名直接访问静态成员变量呢?

实践出真知,运行效果图如下: 

 那么我们就需要记得:静态成员变量有两种访问方式,第一种是通过对象,第二种是通过类名

2、静态成员函数

静态成员函数有着如下的特点:

  • 程序共享一个函数
  • 静态成员函数只能访问静态成员变量

对于第一个特点程序共享一个函数怎么理解,通过案例代码来进行深刻理解:

class Data
{
public:static void func(){cout << "static void func()函数调用" << endl;}
private:};int main(void)
{Data d1;Data d2;d1.func();cout << "d1 -> func()函数的地址为 : " << &d1.func << endl;d2.func();cout << "d2 -> func()函数的地址为 : " << &d2.func << endl;return 0;
}

静态成员变量有着访问权限的限制问题,那对应的静态成员函数也有着同样的访问权限问题:

当我们使用静态成员函数的时候,静态成员函数只能访问静态成员变量,其余变量是无法访问的,从而得出以下结论:静态成员函数只能访问静态成员变量

静态成员函数和静态成员变量一样,也有着两种访问方式通过对象和类名访问

3、常函数

成员函数加const后我们可以称这个函数为常函数,常函数有着如下特点:

  • 常函数内不可以修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改
class Data 
{
public:Data() {m_A = 0;m_B = 0;}void change() const{this->m_A = 100;}int m_A;mutable int m_B; //可修改 可变的
};

此上述案例代码看起来却似乎没有问题,但是当我们运行的时候会出现报错,因为在常函数里面是不被允许修改成员变量的。如果想要在常函数中修改成员变量,需要在变量前加mutable这个关键字,有了mutable关键字之后,该成员变量就可以在常函数中修改了。

4、常对象

声明对象前加const称该对象为常对象,常对象有着如下特点:

  • 常对象只能调用常函数
class Data 
{
public:Data() {m_A = 0;m_B = 0;//cout << "int m_A = " << m_A << endl;//cout << "mutable int m_B = " << m_B << endl;}void func(){cout << "func()函数调用" << endl;}void change() const{//this->m_A = 100;this->m_B = 100;}int m_A;mutable int m_B; //可修改 可变的
};int main(void)
{//Data d1;//d1.change();//cout << "d1 -> int m_A = " << d1.m_A << endl;//cout << "d1 -> mutable int m_B = " << d1.m_B << endl;const Data d1;//常对象不能修改成员变量的值,但是可以访问//d1.m_A = 100;cout << "const Data d1 -> int m_A = " << d1.m_A << endl;cout << "const Data d1 -> mutable int m_B = " << d1.m_B << endl;//常对象只能使用常函数//d1.func();d1.change();cout << "const Data d1 -> int m_A = " << d1.m_A << endl;cout << "const Data d1 -> mutable int m_B = " << d1.m_B << endl;return 0;
}


http://www.ppmy.cn/news/355847.html

相关文章

系统架构设计师笔记第13期:需求工程

需求工程&#xff08;Requirements Engineering&#xff09;是软件工程中的一个关键过程&#xff0c;旨在识别、分析、规范和验证软件系统的需求。它涉及与相关利益相关者合作&#xff0c;以确保对软件系统的需求达成一致&#xff0c;从而为后续的设计、开发和测试活动提供基础…

[Java 实现pdf转excel ]

目录 前言: Apache POI和pdfbox库实现pdf转excel的详细代码实现&#xff1a; 综上所述: Java实现iText pdf转excel详细代码实现 综上所述: 依赖: 前言: 笔记而已 Apache POI和pdfbox库实现pdf转excel的详细代码实现&#xff1a; import java.io.File; import java.io.Fi…

联想thinkpadE14 vm蓝屏问题解决

公司新发了办公电脑&#xff0c;配置如下&#xff1a; 安装vm必定蓝屏&#xff0c;百度了发现有如下解决办法&#xff1a; 1.新建vm.cmd,内容如下&#xff0c;用管理员执行 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor…

联想B460加装MU301

默认情况下&#xff0c;B460是不能使用MU301的&#xff0c;所以我们需要把MU301刷成MU350。 但是插上模块后开不了机&#xff0c;要怎样刷呢&#xff1f;很简单&#xff0c;热插拔&#xff01; 不要惊讶&#xff0c;MINI PCI-E标准是支持热插拔的。只要手上不带电&#xff0c;在…

联想计算机不能使用ghost,联想电脑不能GHOST的解决方法

联想电脑不能GHOST的解决方法 如果将联想电脑的bios恢复成默认设置,那么ghost将在用户确定备份c盘时死机。无论怎么试都这样。 解决方法1: 开机按住del进(awardbios cmos)——integrate peripherals——via onchip ide device——ide hdd block mode将(enabled改为disabled)—…

搜索词联想功能实现方案

需求背景&#xff1a; 实现搜索框的搜索联想功能&#xff0c;当输入框输入字符时候&#xff0c;立刻进行网络请求&#xff0c;将相关推荐展示在下方的列表中&#xff0c;要求每次展示的一定是当前最新输入的内容的推荐词。 实现思路&#xff1a; 展示搜索词联想需要满足如下…

联想服务器控制口登录地址_联想服务器登录管理界面 联想服务器客服

联想服务器怎么进bio? 首先打开电脑。当电脑屏幕上出现“联想”屏幕时,左下角会出现“按F2设置”字样。此时,快速按键盘上的“F2”键进入BIOS设置,如下图所示 联想如何进入BIOS 下一步,电脑将进入硬件BIOS设置界面,如下图所示 联想如何进入BIOS 当我们设置完电脑的BIOS后…

联想E475笔记本进入BOIS设置U盘启动顺序、

U大师装机 1、长按F1进入BOIS程序设置界面 2、找到 Security ---Secure Boot 改为Disabled 3、-----Startup --UEFI / Legacy Boot 改为 Legacy 0nly 4、----Startup ---将USB HDD U盘启动顺序 改为第一位 5、插入U盘 进入U大师装机系统 进入ISOS文件夹 选择镜像…