C++之static,静态变量

article/2025/8/29 8:05:00

目录

1.为什么要用静态变量

2.全局变量

3.静态局部变量

4.静态数据成员的空间开辟

5.静态数据成员

6.释放

7.总结

1.内存:

2.初始化:

3.最大的优点:

4.指针:

5.释放时机:


1.为什么要用静态变量

前面我们定义学生类统计学生信息,只统计了学生的学号、姓名、性别,如果现在我们计算统计的学生的数量,我们该怎么做?

普通成员变量是本类某个对象:


class Student
{
public:Student(int num = 0, const char* name = "", char sex = 'm') :m_count(0),m_num(num), m_sex(sex){m_name = new char[strlen(name) + 1];strcpy_s(m_name, strlen(name) + 1, name);m_count++;}~Student(){if (m_name != NULL){delete[]m_name;m_name = NULL;}}void Print(){cout << "总数" << m_count << endl;}
private:int m_num;char* m_name;char m_sex;int m_count;
};void main()
{Student s(1001, "张三", 'm');s.Print();Student s1(1002, "李四", 'f');s1.Print();Student s2(1003, "王五", 'm');s2.Print();
}

我们会发现,三次计算出来的结果都是1,并不是我们所想的1、2、3,这里面的count,每次构造一个心得对象,count都是从0开始计数+1,那我们该怎么让count第一次+1之后第二次构造对象之后计数时从1开始+1得到2呢?

2.全局变量


int m_count=0;
class Student
{
public:Student(int num = 0, const char* name = "", char sex = 'm') :m_num(num), m_sex(sex){m_name = new char [strlen(name) + 1];strcpy_s(m_name, strlen(name) + 1, name);m_count++;}~Student(){if (m_name != NULL){delete[]m_name;m_name = NULL;}}void Print(){cout << "总数" << m_count << endl;}
private:int m_num;char* m_name;char m_sex;
};void main()
{Student s(1001, "张三", 'm');s.Print();Student s1(1002, "李四", 'f');s1.Print();Student s2(1003, "王五", 'm');s2.Print();
}

通过这个我们发现全局变量达到了我们期望的结果,每新构造一个对象,总数加一,但如果一不下心误改了总数,会对结果产生影响吗? 

int m_count=0;
class Student
{
public:Student(int num = 0, const char* name = "", char sex = 'm') :m_num(num), m_sex(sex){m_name = new char [strlen(name) + 1];strcpy_s(m_name, strlen(name) + 1, name);m_count++;}~Student(){if (m_name != NULL){delete[]m_name;m_name = NULL;}}void Print(){cout << "总数" << m_count << endl;}
private:int m_num;char* m_name;char m_sex;
};
void Test()
{m_count = 10;
}
void fn()
{m_count = 20;
}
void main()
{Student s(1001, "张三", 'm');Student s1(1002, "李四", 'f');Student s2(1003, "王五", 'm');s.Print();Test();s1.Print();fn();s2.Print();
}

 我们发现,s.Print();计算出了最后的总数为三,但经过Test函数后,count被改为10,经过fn函数后又被改为20,那么如果再写一些类似函数,这个count的值会一直被无限修改下去,会出现问题,不能达到我们的目的 error

总结:

全局变量可以实现对象的共享

但是没有权限限制,导致请他的函数或者对象可以无限修改,

则会出现问题(不安全)

3.静态局部变量

void fn()
{int a = 0;static int b = 0;a++;b++;cout << "a=" << a <<"   " << "b=" << b << endl;
}
void main()
{for (int i = 0; i < 5; i++)fn();
}

int a = 0;//第二次来的时候,第一次的空间消失了
static int b = 0;//第一次遇到b进行初始化,第二次来的时候之前的空间没有消失(在静态存储

我们发现静态函数再次进入函数没有重新初始化,直接+1,可以用这个解决这个问题。

4.静态数据成员的空间开辟

* 静态数据成员的空间开辟?
*    1.类的声明 .h//多次引用,反复开辟空间
*    2.类的成员函数的定义文件 user.cpp √
*    3.测试文件 test.cpp //用户需分辨,还需开辟空间

class A
{
public://A():m_a(1),m_b(2),m_c(3){}A() :m_a(1), m_b(2){m_c = 3;//赋值}void Print(){cout << m_c << endl;}
private:int m_a;char m_b;//static int m_c=20;static int m_c;
};
int A::m_c=10;
//int A::m_a = 2;
void main()
{cout << sizeof(A) << endl;A a;A b;a.Print();b.Print();//cout<<A::m_c<<endl;
}

//A():m_a(1),m_b(2),m_c(3){}//m_c不能再构造函数中初始化
m_c = 3;//赋值
//static int m_c=20;//还没有空间
static int m_c;//引用性声明 //不在类中开辟空间,不能在类中进行初始化
int A::m_c=10;//定义性声明 开辟空间
//int A::m_a = 2;//error//只有静态可以
b.Print();// 3 不会因为定义性声明 int A::m_c=10; 而改变
 

 通过A的大小为8我们可以得出,static int m_c;并没有在栈中开辟空间

5.静态数据成员

静态数据成员 实现了本类对象的共享,又实现了限制(类作用域)


class Student
{
public:Student(int num = 0, const char* name = "", char sex = 'm') : m_num(num), m_sex(sex){m_name = new char[strlen(name) + 1];strcpy_s(m_name, strlen(name) + 1, name);m_count++;}~Student(){if (m_name != NULL){delete[]m_name;m_name = NULL;}}void Print(){cout << m_num<<" "<<m_name<<" "<<m_sex<<"总数:" << m_count << endl;}//static void Show()//{//	cout << "Show" << endl;//	//cout << m_num << " " << m_name << " " << m_sex << "总数:" << m_count << endl;//}static void Show(Student &s){cout << "Show" << endl;cout << s.m_num << " " << s.m_name << " " << s.m_sex << "总数:" << m_count << endl;}
private:int m_num;char* m_name;char m_sex;static int m_count;//const int m_i;//const static int m_count=20;};
int Student::m_count;
void main()
{Student s(1001, "张三", 'm');Student s1(1002, "李四", 'f');s.Print();Student s2(1003, "王五", 'm');s1.Print();s2.Print();s.Show(s);Student::Show(s2);//Student::Print();
};

//static函数中,没有this指针,所有不能直接输出非static数据成员
    //static void Show()
    //{
    //    cout << "Show" << endl;
    //    //cout << m_num << " " << m_name << " " << m_sex << "总数:" << m_count << endl;
    //}
static int m_count;//不能在成员初始化列表
//const int m_i;//成员初始化列表
//const static int m_count=20;//最好不要这样写,奇怪
s.Show(s);//不管用哪个对象调用static,其实用的是当前对象的类型
Student::Show(s2);//静态可以用类直接调用,不依附对象(不声明对象,也可以调用成员函数)//优点:不用特别声明对象调用函数
    //Student::Print();//非static,有this指针,必须通过对象调用

6.释放

观察以下代码,试想运行结果

#if 0
class A
{
public:A() { cout << "A" << endl; }~A() { cout << "~A" << endl; }
};
void Test()
{static A a;//A b;
}
void main()
{cout << "main begin" << endl;for (int i = 0; i < 5; i++)Test();cout << "main end" << endl;
}

cout << "main end" << endl;//在这后面即就是程序结束才调用析构

 第一次调用开辟空间,再遇见不开辟空间也不初始化,等程序执行完毕才释放空间

7.总结

1.内存:

静态局部变量在全局数据区分配内存,局部变量在栈区分配内存

2.初始化:

静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会执行默认初始化,所以一定要手动初始化,否则会是很奇怪的随机值)

3.最大的优点:

可以和全局变量一样只初始化一次,可以将值保存至下一次函数调用时,而访问范围限定在函数内,不被其他地方访问到(局部变量在栈区,在函数结束后立即释放内存,所以局部变量在每次函数调用时都会被初始化)

4.指针:

普通成员函数有 this 指针,可以访问类中的任意成员;

静态成员函数没有 this 指针,不知道指向哪个对象,所以无法访问对象的成员变量,只能访问静态成员(包括静态成员变量和静态成员函数)

5.释放时机:

 第一次调用开辟空间,再遇见不开辟空间也不初始化,等程序执行完毕才释放空间


http://chatgpt.dhexx.cn/article/BF2tIwX3.shtml

相关文章

C++静态变量

静态变量&#xff08;Static Variables&#xff09;是在程序运行期间保持其存在和值的变量&#xff0c;不会随着函数的调用而销毁和重新创建。静态变量在内存中分配一次&#xff0c;并且在整个程序的生命周期中保持存在。 在 C 中&#xff0c;静态变量可以声明在函数内部、类内…

win10显示rpc服务器不可用,win10系统RpC服务器不可用的详细办法

win10系统使用久了&#xff0c;好多网友反馈说win10系统RpC服务器不可用的问题&#xff0c;非常不方便。有什么办法可以永久解决win10系统RpC服务器不可用的问题&#xff0c;面对win10系统RpC服务器不可用的图文步骤非常简单&#xff0c;只需要1、使用netsh interface ip add 添…

w7系统显示rpc服务器不可用,教你win7系统rpc服务器不可用怎么办

用户在使用电脑进行时间同步&#xff0c;安装打印机或者其它的操作的时候可能会遇到同样一个问题&#xff0c;那就是提示“RPC服务器不可用”&#xff0c;很多朋友可能对于RPC并不了解&#xff0c;更不知道如何解决&#xff0c;下面&#xff0c;小编就来跟大家讲解rpc服务器不可…

计算机无法登陆提示rpc服务器不可用,电脑rpc服务器不可用,教你电脑rpc服务器不可用怎么解决...

有网友表示进入磁盘管理对磁盘进行分区、更改盘符或压缩卷等操作的时候出现“RPC服务器不可用”的报错&#xff0c;rpc服务器不可用怎么办?很多朋友可能对于RPC并不了解&#xff0c;下面小编教你电脑rpc服务器不可用怎么解决吧。 rpc服务器不可用怎么办 打开“运行”窗口&…

rpc服务器不可用自动重启,rpc服务器不可用_详细解决方法,彻底修复

通过测试证明,“rpc服务器不可用”可能是由于中了冲击波和震荡波导致。 虽然这个是很老的病毒,但还是有小部分用户没有对系统没有进行升级导致出现“rpc服务不可用”情况。 电脑遭到冲击波可能会出现以下症状: 1、系统资源紧张,应用程序运行速度异常。 2、Word、Excel、Pow…

rpc服务器不可用桌面图标消失,rpc服务器不可用,教您rpc服务器不可用怎么办

有网友表示进入磁盘管理对磁盘进行分区、更改盘符或压缩卷等操作的时候出现“RPC服务器不可用”的报错&#xff0c;通常我们在安装打印机或者虚拟磁盘时&#xff0c;将出现此提示。下面&#xff0c;小编给大家介绍rpc服务器不可用的处理技巧。 用户在使用电脑进行时间同步&…

计算机无法登陆提示rpc服务器不可用,电脑提示RPC服务器不可用的解决方法

最近有Win7用户反映在使用打印机或使用电脑进行时间同步的时候&#xff0c;突然弹出“RPC服务器不可用”的提示&#xff0c;很多用户可能对于RPC并不了解&#xff0c;更不知道如何解决&#xff0c;现在小编就和大家分享Win7系统RPC服务器不可用的解决方法。 RPC服务器&#xff…

为什么我的电脑显示rpc服务器不可用,电脑提示RPC服务器不可用解决办法

电脑提示"RPC服务器不可用"解决办法 腾讯视频/爱奇艺/优酷/外卖 充值4折起 在使用电脑的过程中&#xff0c;有些小伙伴遇到了电脑提示“RPC服务器不可用”的情况。那么&#xff0c; 电脑提示“RPC服务器不可用”怎么办呢?下面&#xff0c;就和小编一起来看看吧。 原…

xp显示rpc服务器不可用,WinXP系统rpc服务器不可用怎么解决?

最近有WinXP系统用户反映&#xff0c;使用数据线直接将手机照片向电脑复制的时候&#xff0c;出现提示“rpc服务器不可用”&#xff0c;这让用户非常苦恼。那么&#xff0c;WinXP系统rpc服务器不可用怎么解决呢&#xff1f;下面&#xff0c;我们就一起往下看看WinXP系统rpc服务…

虚拟盘rpc服务器不可用,rpc服务器不可用,手把手教你rpc服务器不可用怎么办

有网友表示进入磁盘管理对磁盘进行分区、更改盘符或压缩卷等操作的时候出现“RPC服务器不可用”的报错&#xff0c;通常我们在安装打印机或者虚拟磁盘时&#xff0c;将出现此提示。下面&#xff0c;小编给大家介绍rpc服务器不可用的处理技巧。 网上介绍关于&#xff02;RPC服务…

rpc服务器不可用处于启用状态,电脑提示RPC服务器不可用怎么办?

电脑提示"RPC服务器不可用"怎么办? 腾讯视频/爱奇艺/优酷/外卖 充值4折起 原因分析: 根据报错信息观察RPC服务是已启动的状态,说明此报错还和其他的服务有关。 从而定位到Virtual Disk服务,该服务的作用:提供用于磁盘、卷、文件系统和存储阵列的管理服务。 解决方…

xp显示rpc服务器不可用,XP系统如何解决RPC服务器不可用?

使用打印机或其他操作安装计算机时&#xff0c;它会提示RPC服务器不可用。很多人都会遇到这个问题。 许多朋友可能不了解RPC&#xff0c;他们不知道如何解决它。当用户在WinXP系统计算机上运行时&#xff0c;RPC服务器不可用该怎么办&#xff1f;让我们来看看WinXP系统RPC服务器…

导出文件提示rpc服务器不可用,rpc服务器不可用怎么办 RPC服务器不可用解决方法有哪些...

【rpc服务器不可用】rpc服务器不可用怎么办?RPC服务器不可用解决方法汇集 A简单方法: 通过"控制面板/管理工具/服务",检查一下RPC的Remote Procedure Call (RPC)和Remote Procedure Call (RPC) Locator这两项服务的情况,将它们设置为自动启动。 如果还不行,看看D…

rpc服务器不可用 不显示桌面,rpc服务器不可用,教您rpc服务器不可用怎么解决

用户只要选择“Internet 时间”中的立即更新&#xff0c;就能获得一个比较准确的系统时间。不过&#xff0c;不少用户在点击“立即更新”后&#xff0c;却遇到了“RPC服务器不可用”的错误提示&#xff0c;这是怎么回事呢&#xff1f;下面&#xff0c;小编跟大伙一同探讨一下rp…

视频文件rpc服务器不可用,RPC服务器不可用怎么办

现在使用电脑既是一股潮流&#xff0c;又是一种必要。能够熟练地操作电脑&#xff0c;就意味着你比其他人多了一份优势&#xff0c;有时候我们在使用打印机的时候&#xff0c;突然弹出rpc服务不可用&#xff0c;rpc服务器专门为通信程序之间携带信息数据&#xff0c;那么RPC服务…

开机点用户名登录显示rfc服务器不可用,rpc服务器不可用

手机评站网今天精心准备的是《rpc服务器不可用》,下面是详解! 打印时出现,rpc服务器不可用是为什么? 1、打开控制面版(系统版本不一样略不一样),找到服务。 2、服务列表中找到Print spooler,发现这个没启动(没有正在运行)。 3、右键点启动(自动)就可以了,一般这样就可以…

出现RPC服务器不可用的解决方法

转自文章 http://www.xitonghe.com/jiaocheng/diannao-156.html 出现RPC服务器不可用的解决方法 RPC服务器&#xff0c;是指Remote Procedure Call Protocol&#xff0c;中文释义为&#xff08;RFC-1831&#xff09;远程过程调用协议&#xff1a;一种通过网络从远程计算机程…

【电机学】直流电机

直流电机 什么是直流电机直流电机的工作原理直流发电机的工作原理&#xff1a;直流电动机的工作原理可逆性原理 直流电机的主要结构部件直流电机的电枢绕组基本特点并联支路对数电刷的放置 一些概念 直流电机的磁场直流电机的空载磁场&#xff08;电枢电流Ia0&#xff09;直流电…

城市交通出行效率对比分析与思考

来源&#xff1a;规划与交通 出行效率是指居民以最少的出行投入&#xff08;包含最少的货币成本和时间成本、最舒适和最安全的出行体验等&#xff09;&#xff0c;利用某种交通方式完成某种出行目的的活动。出行效率强调的是“全过程”出行&#xff0c;即真正的“门到门”服务&…

基于Spring Security与JWT实现单点登录

基于RBAC的权限管理 RBAC(Role-Based Access Control&#xff09;&#xff1a;基于角色的访问控制 当前项目中&#xff0c;RBAC具体的表现为&#xff1a; 管理员表&#xff1a;ams_admin 角色表&#xff1a;ams_role 权限表&#xff1a;ams_permission 管理员与角色的关联表&am…