首页 > 编程语言 >C++:全局变量和static变量初始化

C++:全局变量和static变量初始化

时间:2023-05-16 17:58:15浏览次数:46  
标签:初始化 变量 静态 成员 C++ static 全局变量 定义

(一)全局变量

全局变量、文件域中的静态变量、类中的成员静态变量在main函数执行前初始化;

局部变量中的静态变量在第一次调用时初始化。

C++保证,全局变量在main函数第一次使用它之前,就把它初始化好。(可以直接理解成在main函数执行前就初始化好)但这个初始化可细分为:编译时初始化运行时初始化,即static initialization和dynamic initialization。

1.static initialization

静态初始化,是针对于那些简单的、c++内部定义的数据结构,如int,double,bool及数组结构的初始化,又可分为zero和const两种方式。

对于zero初始化,也就是我们没指定初值,编译器分配0值给它,编译时编译器将其分配在bss段,不占用rom空间;

BSS段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0,所以,未初始的全局变量在程序执行之前已经成0了。

const初始化,也就是我们指定了初值,编译器将其分配在data段,占用rom空间。

数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。

2.dynamic initialization

这种初始化针对的是需要调用构造函数才能完成的初始化。这种初始化会在main函数执行前,在运行时由运行时库调用相应的代码进行初始化。

另外,静态初始化先于动态初始化。因为静态初始化发生在编译时期,直接写进bss段和data段,在程序执行时直接加载;

而动态初始化则是在运行时期,由运行时库调用相应构造函数进行初始化,同样要写进bss段或data段。

(二)类的静态成员

C++规定,const的静态成员可以直接在类内进行初始化,而非const的静态成员需要在类外声明以初始化。

使用过类中的静态成员变量的伙伴都发现了,在类中定义的静态成员变量,还必须要在类外定义下才可以使用,否则会编译报错。

那么为什么会出现这种情况呢?

静态成员变量不属于任何一个对象,对象的数据中不应该包含静态成员的数据。所以在定义类的时候不会给静态变量分配内存只是声明,因此就要在其他地方分配即定义。

定义与声明的区别:

声明:只是向程序表面变量的类型和名字。

定义:为变量分配内存,也可以顺便初始化。程序中变量有且只有一个定义(更能说明为什么要在类外再定义下类的静态成员变量了)。

 

标签:初始化,变量,静态,成员,C++,static,全局变量,定义
From: https://www.cnblogs.com/imreW/p/17406383.html

相关文章

  • c++输入输出流对象
    实验项目名称:输入输出流一、实验目的掌握文本文件和二进制文件的基本访问方法;了解一般I/O流和文件流的关系;了解文件与文件流的关系;了解文件系统的概念,包括文件指针和关于文件的操作;掌握文件类的定义和相关操作的定义、使用方法;掌握利用常用函数进行文件的打开、关闭、读写......
  • c++打卡练习(31)
    求两个整数的最大公因数流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ intx,y,i,k; cout<<"请输入两个整数"<<endl; cin>>x; cin>>y; if(x<y){ intt; t=x; x=y; y=t; } for(i=y;i>=1;i--){ if(x%i==0&&y%i=......
  • c++打卡练习(30)
    不重复的三位数用1234这四个数组成不重复的三位数,每个数位的数也不同,问都有谁流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ inta,b,c,d; for(a=1;a<=4;a++){ for(b=1;b<=4;b++){ for(c=1;c<=4;c++){ if(a!=b&&a!=c&&b!=c){ cout<<a&......
  • C++ | 运算符重载
    1.运算符重载1.1基本概念函数重载(函数多态)是指用户能够定义多个名称相同但参数列表不同的函数,旨在使用户能够用同名的函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。实际上,很多C++(也包括C语......
  • 《c++徒步》vs界面详解
    vs2010字符集:多字节字符集和Unicode字符集是不同的字符集标准,主要区别如下:字符编码范围不同:多字节字符集使用单字节或多个字节来表示字符,编码范围较窄,通常只能表示本地语言的字符集。Unicode字符集则是全球通用的字符编码标准,可以同时表示全球范围内的多种语言字符集。字......
  • C++ 图进阶系列之剖析二分图的染色算法和匈牙利算法
    1.前言二分图又称作二部图或称为偶图,是图论中的一种特殊类型,有广泛的应用场景。什么是二分图?二分图一般指无向图。看待问题要有哲学思想,有二分图也可以是有向图。如果图中所有顶点集合能分成两个独立的子集,且任一子集中的任意顶点之间没有边连接,则称这样的图为二分图。......
  • 编写C++时遇到"undefined reference to `std::cout'"
    今天直接将C语言的配置文件粘贴到了C++的工程里面,代码没有报错但是编译报错后面自己试了一下发现用gcc编译c++的话就会报"undefinedreferenceto`std::cout'"的错误解决方法:用g++重新编译......
  • C/C++ CreateFileMapping 共享内存
    原链接C/C++CreateFileMapping共享内存-lyshark-博客园(cnblogs.com)#include<iostream>#include<Windows.h>usingnamespacestd;intmain(){HANDLEhMap;PINTlpMapAddr;//getfilemapping'shandlehMap=OpenF......
  • http yolov5 tensorrt C++ windows 客户端服务器高性能部署,使用tensorrt推理yolov5模
    httpyolov5tensorrtC++windows客户端服务器高性能部署,使用tensorrt推理yolov5模型,封装成了dll;http服务器,监听指定端口、调用dll加载模型到内存(可同时支持多个模型同时加载并行运行)同时监听指定http指定路径是否有请求,收到请求后解析json数据中数据,从中解析出识别指定模型类......
  • yolov5 yolov5_obb rotate 旋转目标检测 C/C++ 支持同时多相机和多模型
    yolov5yolov5_obbrotate旋转目标检测C/C++支持同时多相机和多模型windowsvs2019封装dll,一个dll,支持同模型多次加载和不同模型同时多次加载,支持mfc,和qt调用,支持批量图片识别,Demo支持图片、视频、文件夹和RTSP流识别。ID:143000668549326309......