C++变量作用域

简介: C++变量作用域分为局部、全局、块和类作用域。局部变量在函数内定义,仅内部可用;全局变量在所有函数外定义,整个程序可访问;块作用域变量存在于代码块内;类作用域变量属于类成员。同名时,内层作用域覆盖外层。全局变量自动初始化,局部变量需手动初始化。

C++变量作用域

一般来说有三个地方可以定义变量:

  • 在函数或一个代码块内部声明的变量,称为局部变量
  • 在函数参数的定义中声明的变量,称为形式参数
  • 在所有函数外部声明的变量,称为全局变量

作用域是程序的一个区域,变量的作用域可以分为一下几种:

  • 局部作用域:在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每次被调用时被创建,在函数执行完后会被销毁。
  • 全局作用域:在所有函数和代码块之外声明的变量具有全局作用域,它们可以被程序中的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。
  • 块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完之后被销毁。
  • 类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问。类作用域变量的声明周期与类的生命周期相同。

注意:如果在内部作用域中声明的变量与外部作用域中的变量同名,则内部作用域中的变量将覆盖外部作用域中的变量。

局部变量

在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。下面的实例使用了局部变量:

#include<iostream>
using namespace std;

int main()
{
    //局部变量声明
    int a, b;
    int c;

    //事迹初始化
    a = 10;
    b = 20;
    c = a + b;

    cout << c;

    retrun 0;
}

全局变量

在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。下面的实例使用了全局变量和局部变量:

#include<iostream>
using namespace std;
//全局变量声明
int g;

int main()
{
    //局部变量声明
    int a, b;
    //实际初始化
    a = 10;
    b = 20;
    g = a + b;
    cout << g;
    return 0;
}

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例:

#include <iostream>
using namespace std;

// 全局变量声明
int g = 20;

int main ()
{
  // 局部变量声明
  int g = 10;

  cout << g;

  return 0;
}

当上面的代码被编译和执行时,他会产生下列结果:

10

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化下列值:

数据类型 初始化默认值
int 0
char '\0'
float 0
double 0
pointer NULL

块作用域指的是在代码块内部声明的变量:

#include <iostream>

int main() {
    int a = 10;
    {
        int a = 20;  // 块作用域变量
        std::cout << "块变量: " << a << std::endl;
    }
    std::cout << "外部变量: " << a << std::endl;
    return 0;
}

以上实例中,内部的代码块中声明了一个名为a的变量,它与外部作用域中的变量a同名。内部作用域中的变量a将覆盖外部作用域中的变量a,在内部作用域中访问a时输出的是20,而在外部作用域中访问a时输出的是10。当上面的代码被编译和执行时,它会产生下列结果:

块变量:20
外部变量:10

类作用域

类作用域指的是在类内部声明的变量:

#include <iostream>
class MyClass{
pbulic:
    static int class_var;//类作用域变量
};
 int MyClass::class_var = 30;

int main(){
    std::cout <<"类变量:" << MyClass::class_var << std::edl;
    return 0;
}

以上实例中,MyClass类中声明了一个名为class_var的类作用域变量。可以使用类名和作用域解析运算符::来访问这个变量。在main()函数中访问 class_var 时输出的是30.

类变量:30
相关文章
|
存储 SQL 监控
一文解读如何落地企业级云上日志审计方案
近年来,随着云计算的广泛应用和企业上云的深度普及,许多企业或个人用户将各种日志托管在云上进行留存,从而进行查询、审计等操作。什么是日志审计?为什么要做日志审计?企业如何落地云上日志审计方案?带着这些问题出发,本文将以阿里云日志服务(SLS)旗下的日志审计服务为视角切入,带领读者从当今网络安全形势和法律法规要求出发,解读云计算背景下,如何构建、运行、实践一个标准的企业级云上审计方案,从而更好地保障企业或组织的云上资产、云上数据的安全,确保企业业务持续安全稳定地运行。
|
安全 Linux 编译器
全面介绍eBPF-概念
全面介绍eBPF-概念
945 1
|
消息中间件 Java Kafka
开发者如何使用云消息队列 Kafka 版
【10月更文挑战第15天】开发者如何使用云消息队列 Kafka 版
729 105
|
机器学习/深度学习 算法 物联网
《风控要略:互联网业务反欺诈之路》一万字读后详细总结
本书的内容正如书名所述,是为要略而非攻略,即作者站在一个更为宏观的角度,以自身的从业经验对当今风控领域做了一番较为全貌的总结概述。书中的章节内容有精有简,既为要略,那么就无法苛求其内容都足够全面与详细。它更像是一部风控领域的科普类简述作品,在广度上能较好地让读者了解到风控各方面的现状及走向,但若要谈及深度,则多少有种“师父领进门,修行在个人”的感觉。这本书其实有挺多人推荐,一方面是书籍出版时间距离现在很近,一方面则是填补风控业务领域入门书籍的空白,只是通篇读完,好的地方是有,值得吐槽的地方也不少。总而言之,对于像我这样风控小白而言,还是值得翻阅一番。
704 0
|
.NET 开发框架
IIS7错误“Web服务器被配置为不列出此目录的内容”的解决办法
用IIS7调试ASP程序,出现“Web服务器被配置为不列出此目录的内容”这个错误提示,解决方法如下; 打开 控制面板 - 管理工具 - Internet 信息服务(IIS)管理器 - 目录浏览 选择启用即可。
4501 0
|
6月前
|
人工智能 自然语言处理 数据可视化
2026年BI工具推荐,企业如何选择最适合的可视化分析工具?
数据驱动时代,BI工具成企业刚需。2025年全球市场规模将超380亿美元,AI赋能的Quick BI等产品引领变革,支持自然语言交互与智能洞察,助力企业高效决策。
|
Oracle 关系型数据库 Unix
关系型数据库Oracle设置环境变量:
【7月更文挑战第22天】
2437 4
|
JavaScript 前端开发 编译器
10min代码快速熟悉Tsconfig.json配置文件
【8月更文挑战第16天】10min代码快速熟悉Tsconfig.json配置文件
857 2
|
前端开发 网络协议 JavaScript