首页 > 编程语言 >C/C++ 中 static 关键字解析

C/C++ 中 static 关键字解析

时间:2023-08-19 22:55:36浏览次数:27  
标签:初始化 变量 静态 作用域 C++ 关键字 static 全局 全局变量

局部静态变量的特点:

  1. 全局数据区
  2. 执行到函数内对象声明处首次初始化,若没有显示初始化,自动初始化为0,且只初始化一次
  3. 始终驻留在全局区,直到程序结束,作用域为局部作用域,在函数或语句块内,生命周期到程序结束

全局静态变量的特点:

  1. 全局区
  2. 在main函数执行前分配内存并初始化

  注意:全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。

全局变量和全局静态变量的区别:

  1. static修饰全局变量,这个全局变量只能在本文件中访问,加extern外部声明也不行,而普通全局变量在另一个文件中加了extern声明,就可以被访问,作用域是整个工程。

  注意:在同一个工程的多个文件定义同名普通全局变量,可能出现链接错误。

类内的静态数据成员和静态成员函数:

  静态数据成员:

  1. 不占用类的大小,被所有对象共享
  2. 不能放在初始化表达式初始化,要在类外全局的位置初始化
  3. 头文件实现文件分开的形式,要在实现文件初始化,否则报多重定义错误

  静态成员函数:

  1. 不含this指针
  2. 静态不能访问非静态(不含this指针,无法访问对象)
  3. 非静态可以访问非静态和静态(因为静态成员所有类对象共享)
  4. 静态想要访问非静态,可以将this指针作为参数传递进来,或者在静态成员函数内创建对象
  5. 类名加作用域限定符访问静态成员,其他非静态不能这样用

标签:初始化,变量,静态,作用域,C++,关键字,static,全局,全局变量
From: https://www.cnblogs.com/Zhaolongtao/p/17643367.html

相关文章

  • 使用WebAssembly实现高性能计算:C++和Rust的案例分析
    WebAssembly是一种新型的低级字节码格式,它可以在浏览器中运行高效的编译代码。使用WebAssembly可以实现高性能计算、游戏引擎等功能,对于需要大量计算的Web应用程序来说尤为重要。本文将介绍使用WebAssembly实现高性能计算的两个案例:C++和Rust。C++C++是一种高性能的编程语言,它......
  • C++入门:内联函数
    1.概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。查看方式:1.在release模式下,查看编译器生成......
  • C++ 突袭
    基本知识必须在函数声明中声明默认参数!默认参数必须在形参列表的结尾!避免歧义函数声明就是函数的身份证,外部调用方不看定义只看声明和取地址类似函数overload函数重载要求:函数的名字相同参数列表(数量,类型)不同注意:与返回值无关问题--避免overlo......
  • C++序列化封装EasySerialize
      最近在做C++项目,需要序列化和反序列化json以及xml数据。可能是由于用惯了C#等更高度化语言,搜了一遍,发现C++没有特别方便使用的序列化、反序列化的库。大部分库都是为了实现功能(非常感谢这些实现库的作者),使用时,需要根据字段深度定义结构体字段(这一步无法省略),然后再使用手动编......
  • 24届C++后端开发八月面经
    百度提前批一面项目:日志模块,如何实现保证写入和非保证写入如何保证日志时间的实时性?不用文件大小作为文件滚动的标注,而是使用时间作为标识更加符合查看日志的需求webserver如何与MYSQL数据库进行交互?当有非常多的并发量,如何进行一个MYSQL底层存储的优化?记录用户uid最......
  • c++ 面试整理
    如何理解封装、继承、多态封装可以隐藏实现细节,使得代码模块化;封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。多态多态指同一个实......
  • 二分搜索法-C++
    二分法,就是对一个数组中,已经排好序的数字进行搜索。使用二分法的前提条件:1.是一个数组2.该数组中的数字已经是有序的,比如升序的数字或者降序的数字都可以。inta[]={1,2,3,4};   intb[]={4,3,2,1};3.该数组中没有出现重复的数字 二分法原理:就是对一个数组,不断的划分......
  • C++问题汇总
    一、执行C++程序报错1、现象#现象./gtest_W:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.20'notfound(requiredby./gtest_W)./gtest_W:/lib64/libstdc++.so.6:version`CXXABI_1.3.9'notfound(requiredby./gtest_W)./gtest_W:/lib64/libstdc++.so.6:version......
  • C++入门到放弃(11)——继承
    ​继承是面向对象编程语言当中,最重要的部分,也是代码重用的一种重要形式。不知道为啥不能添加代码了,全部只能用图片替代了。1.基本形式首先继承的有三种基本形式,分别是public、private、protected,代表公有继承、私有继承和保护继承,之前在介绍作用范围的时候提过这三者的区别,但这......
  • VScode软件的安装以及C/C++环境配置的方法
    今天和大家分享一下VScode软件的安装以及C/C++环境配置的方法。手把手教大家入门。1,下载VScode编译器(1)   官网下载链接:https://code.visualstudio.com/ (2)安装VScode。安装过程中的附加任务建议全部勾选。 至此VScode安装完成 2,下载编译器MinGW。(1)下载地址:https:......