首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C/C++中static关键字用法总结

  • 25-02-17 10:01
  • 3100
  • 8398
blog.csdn.net

C++基础专栏:http://t.csdnimg.cn/4FdOH

目录

1.引言

2.静态局部变量

3.静态全局变量

4.静态函数

5.静态成员变量

6.静态成员函数

7.总结


1.引言

        在面试的过程,面试官经常都会问到static关键字有哪些用法?在C/C++中各有些什么作用?今天就在这里我们好好的总结一下static的全方位用法。

2.静态局部变量

        局部变量也就是定义在函数内部的变量,函数局部变量存放在栈区,该变量的生命周期由所在 {} 决定,进入 {} 作用范围而分配内存空间,退出 {} 作用范围而释放内存空间。在局部变量的前面加上static,变成静态局部变量,即使多次调用该函数,静态变量的空间也只分配一次。

C/C++中{}的用法总结(全)_c++ {}-CSDN博客

        定义在函数体内的变量加上static修饰符,它的存在意义是随着第一次函数的调用而初始化,但却不随着函数的调用结束而销毁。因此静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

设计模式之单例模式-CSDN博客

        示例如下:

  1. #include
  2. using namespace std;
  3. void test(void)
  4. {
  5. int a = 1; // 局部变量
  6. static int b = 10; //静态局部变量
  7. a++;
  8. b++;
  9. cout << "a:" << a << ", b: " << b << endl;
  10. }
  11. int main()
  12. {
  13. test(); //输出: a=1,b=11
  14. test(); //输出: a=1,b=12
  15. test(); //输出: a=1,b=13
  16. test(); //输出: a=1,b=14
  17. return 0;
  18. }

3.静态全局变量

        全局变量的空间会在程序的生命周期内分配,在全局变量的前面加上static,变成静态全局变量。

        静态全局变量在全局数据区分配内存,那它和全局变量有啥区别呢?
        全局变量不但在本文件中可以被访问,在其他文件中同样可以访问。写代码时很容易在不同文件定义相同名字的全局变量,这就会引发冲突。而静态全局变量只能在声明它的整个文件可见,限制了该变量的访问范围。同样的,静态全局函数,在全局函数前加上static,表示只能在声明文件中被访问。

        示例:变量g_nTotalCount在static.cpp中定义为静态全局变量,因此无法在main.cpp中使用,运行会提示 “无法解析的外部符号”。

  1. //static.pp
  2. #include
  3. #include "static.h"
  4. using namespace std;
  5. static int g_nTotalCount = 22222; //静态全局变量,要想在main.cpp中使用,需定义为全局变量
  6. //int g_nTotalCount = 22222;
  7. void func(void)
  8. {
  9. int x= 11;
  10. cout << "x:" << x << endl;
  11. }
  1. //static.h
  2. #include
  3. void func(void);
  1. //main.cpp
  2. #include
  3. #include "static.h"
  4. using namespace std;
  5. int b = 2425; //全局变量
  6. int main()
  7. {
  8. extern int g_nTotalCount; //申明静态全局变量,运行失败,想用g_nTotalCount,则g_nTotalCount需定义为全局变量,而不是静态全局变量
  9. cout << "g_nTotalCount: " << g_nTotalCount << endl;
  10. func();
  11. return 0;
  12. }

想使用static.cpp中的全局变量g_nTotalCount,则需要定义为全局变量,而不是静态全局变量。

4.静态函数

        在普通函数定义前加上修饰符static就是静态函数,作用和静态全局变量类似;函数的定义和生命在默认状态下都是extern的,但静态函数只是在申明他的文件当中可见,不能被其余文件所用。

5.静态成员变量

        一个类可以定义多个对象,每个对象都会对类中的普通成员变量进行空间分配,这些变量只由它所在对象使用。
        静态成员变量是该类的所有对象所共有的。对于普通成员变量,每个类对象都有自己的一份拷贝,而静态成员变量整个类就一份,静态成员变量只分配一次内存,类的所有对象都共享这个变量,不属于任何一个类,不需要对象就可以访问。
        静态成员变量不属于特定的对象,不会占用对象的内存,必须在类的外面进行初始化。对象的内存中只包括普通成员变量,注意不包括任何成员函数。sizeof(类名) 不会计算静态成员变量和成员函数。
        普通成员变量随这对象的产生而产生,静态成员变量随着类的产生而产生,所以静态成员变量不能由构造函数初始化,即使没有对象,也可以访问静态全局变量。

        示例如下:

  1. #include
  2. #include
  3. using namespace std;
  4. class MyTest
  5. {
  6. public:
  7. static int m_x; //声明静态成员变量
  8. };
  9. int MyTest::m_x = 3242234; //定义并初始化静态成员变量
  10. int main()
  11. {
  12. printf("m_x:%d, sizeof(MyTest):%d\n", MyTest::m_x, sizeof(m_x));
  13. return 0;
  14. }
  15. //输出:m_x:3242234
  16. sizeof(MyTest)=1

6.静态成员函数

        就像类中的静态成员变量一样,静态成员函数也不依赖于类的对象,不具体作用于某个对象。
        普通成员函数参数自带一个this指针,this指针指向类的对象本身,因为普通成员函数总是属于类对象,当函数被调用时,系统会把当前对象的起始地址赋给 this 指针。
        静态成员函数属于类本身,因此不具有this指针。它无法访问属于类对象的非静态成员变量和非静态成员函数,它只能访问其他静态成员变量和静态成员函数。
        可以通过对象来调用,但还是建议使 类名::静态成员函数 调用静态成员函数。
        静态成员函数和静态成员变量在类实例化之前就已经存在可以访问,而此时非静态成员还是不存在的,因此静态成员函数不能访问非静态成员变量。

        示例如下:

  1. #include
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6. static int a; //类的静态成员变量
  7. static int get_a();//类的静态成员函数
  8. int b;
  9. int get_b();
  10. };
  11. int A::a = 100; //静态成员变量可以在类的外部直接定义
  12. //int A::b = 1000; //普通成员变量在类的外部定义失败
  13. int A::get_a()
  14. {
  15. return a; //类的静态成员函数只能访问类的静态成员变量
  16. //return b + a; //静态成员函数无法调用普通成员变量
  17. }
  18. int A::get_b()
  19. {
  20. return b + a;//普通成员函数可以调用静态成员变量
  21. }
  22. int main(void)
  23. {
  24. cout << "a: " << A::get_a() << endl; //不需要类的实例,也可以调用类的静态成员函数
  25. A m;
  26. m.b = 90;
  27. m.a = 100000;
  28. cout << m.get_a() << endl;
  29. cout << m.get_b() << endl;
  30. cout << m.a << endl;
  31. return 0;
  32. }

7.总结

在使用关键字static的时候,我们需要注意一下几个原则:

  • 被static修饰的变量的存储位置都在静态区,且生命周期延长至整个程序运行结束。

  • static具有隔离作用,被static修饰的全局变量和全局函数的作用域由全局变为当前文件。

  • 静态变量虽然具有全局变量的生命周期,但只能作用于自己的作用域。

  • 普通静态成员需要在类的外面进行初始化。

  • 静态成员函数不能调用类的非静态成员,包括非静态成员和非静态成员函数。

注:本文转载自blog.csdn.net的流星雨爱编程的文章"https://blog.csdn.net/haokan123456789/article/details/137382931"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top