文章目录

  • 1. static的用法和作用?
  • 2.静态变量什么时候初始化

1. static的用法和作用?

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。用static修饰的变量的声明式即为其定义式。如果没有手动的初始化,系统会为该变量提供一个初始值。 但是static变量最好在使用的编译单元里(.c/.cpp)声明定义,如果定义在头文件里,如果头文件被重复引用讲导致变量的重复定义。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

3.static的第三个作用是默认初始化为0(static变量)

其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

static的作用

4.static的第四个作用:C++中的类成员声明static

1)   函数体内static变量的作用范围为该函数体,不同于auto变量,
该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
#include<iostream>
using namespace std;class solution {public:int a;void print() {static int s = 100;cout << s << endl;s++;}
};int main() {solution D1;for (int i = 0; i < 5; i++) {D1.print();}return 0;
}
100
101
102
103
104
2)   static修饰的类的成员变量必须要在类外初始化,
static修饰的类成员函数,既可以在类内定义,又可以在类外定义。
#include<iostream>
using namespace std;class solution {private:static int s;
public:static void print() {cout << "static print" << endl;}//类的静态成员函数可以在类内进行定义
};int solution::s = 1200;//在类的静态成员变量必须在类外进行初始化。int main() {solution D1;D1.print();return 0;
}
3)   在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
#include<iostream>
using namespace std;class solution {private:static int s;
public:static void print() {cout << "static print" << s << endl;}void pprint() {cout << "pprint" << s << endl;}void ppprint();
};int solution::s = 1200;void solution::ppprint() {cout << "ppprint" << s << endl;
}
int main() {solution D1;D1.print();D1.pprint();D1.ppprint();return 0;
}
static print1200
pprint1200
ppprint1200
4)   在模块内的static函数只可被这一模块内的其它函数调用,
这个函数的使用范围被限制在声明它的模块内;   5)   在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;   6)   在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,
因而只能访问类的static成员变量。
7)   由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,
this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,
只能访问 static修饰的类成员;8)   static成员函数不能被virtual修饰,static成员不属于任何对象或实例,
所以加上virtual没有任何实际意义;
静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,
而vptr是通过this指针调用的,所以不能为virtual;
虚函数的调用关系,this->vptr->ctable->virtual function

2.静态变量什么时候初始化

  1. 初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内存。

  2. 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。

  3. 而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。

C++学习——static相关推荐

  1. C++学习--static函数,内联(inline)函数, 友元 (friend) 函数

    简单总结一下C++中的各种特殊函数 1.static成员函数 定义在类体中,定义时在前面加static关键字: class Test{ static void getID(); } static 函数 ...

  2. Java基础:详解static关键字与类加载顺序

    1. 前言 前文中说到了static关键字,在Java中这是一个很重要的关键字,它有很多的用法,并且在某些特定的情况下使用可以优化程序的性能.本文学习static关键字的应用场景.在这之前了解变量的类 ...

  3. 语言的学习基础,100个经典的算法

    POJ上做做ACM的题 语言的学习基础,100个经典的算法 C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生 ...

  4. java 静态代码块 作用域_java static关键字和代码块

    static关键字 为什么需要学习static关键字? 针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑使用static关键字 static概述: 多个对象共享同一份数据 static ...

  5. c语言输出变量案例,C语言经典例题100例——C语言练习实例41解答(static静态变量的用法)...

    题目:学习static定义静态变量的用法. 程序分析:无. 程序源代码: // 百宝箱工作室官方网址 http://www.baibaox.com // 百宝箱工作室业务介绍 http://www.b ...

  6. 侯捷C++学习记录-面向对象高级编程下

    本章谈到三大函数.stack堆.heap栈和内存管理. new 操作 与 delete 操作,最后对String类实现进行复习. 学习static 关键字及类模板涉及到的设计模式有:单例模式.Adap ...

  7. static静态变量 与 常量

    变量: 在学习static静态变量之前,我们还是有必要来了解 变量 的意义.程序要对数据进行读.写.运算等操作,当需要保存特定的值或结果的时候就需要用到变量,在用户看来,变量是用来描述一条信息的名称, ...

  8. C语言静态变量static的分析

    对C语言静态变量static分析,解释了static为什么在局部变量里面定义的时候不会随着函数执行完毕而销毁,也稍微用解释了静态存储区和动态存储区的小知识 文章目录 学习static前要先认识 sta ...

  9. 学习C语言(完整版)

    目录 1.第一个程序 2. 变量 3. 常量和宏定义 4. 数据类型 5. 字符和字符串 6. 算术运算符 7. 关系运算符和逻辑运算符 8. if语句 9. switch语句和分支嵌套 10. wh ...

最新文章

  1. Python制作当年第一款手机游戏-贪吃蛇游戏(练习)
  2. Prometheus监控业务指标
  3. (011) java后台开发之泛型类
  4. 长庆企业信息化管理课件_详解:企业信息化管理系统,不能马虎对待
  5. silverlight 使用IValueConverter 转换
  6. android 数据库实例,android – 数据库全局实例
  7. 关于Spring的事务Transactional,锁同步,并发线程
  8. Android开发;Activity-Hook你了解多少?一起来debug
  9. peripheralStateNotificationCB
  10. wordpress是用php几开发的,php-WordPress多个开发人员设置
  11. 在板子上电后自动运行程序
  12. ospf 指定dr_OSPF的基本配置及DR /BDR选举的实验
  13. apache网站访问需要密码设置步骤总结
  14. altium 快速设置网络_通过加载CAD“快速选择”插件,可以很大的提高绘图效率...
  15. ARM指令集之乘法指令
  16. 6大页面数据抓取工具
  17. 什么是localhost(127.0.0.1)?
  18. wpf如何实现按钮的回车事件_c# – 在WPF中模拟Enter键
  19. 报错 Error from server (InternalError): an error on the server (““) has prevented the request from suc
  20. 怎么选型企业客户管理软件?看看别人是怎么做的

热门文章

  1. 天池 在线编程 安排面试城市(贪心)
  2. LeetCode 1155. 掷骰子的N种方法(DP)
  3. LeetCode 820. 单词的压缩编码(后缀树)
  4. LeetCode 114. 二叉树展开为链表(递归)
  5. LeetCode 9. 回文数
  6. 分治应用--万里挑一 找假硬币
  7. python模拟qq空间登录_python selenium模拟登录163邮箱和QQ空间
  8. Java基础10(反射)
  9. 在服务器上安装anaconda遇到的问题总结
  10. 使用docker部署flask项目