「C++系列」C++ 变量作用域

文章目录

  • 一、C++ 变量作用域
  • 二、局部变量
  • 三、全局变量
  • 四、类作用域
  • 五、相关链接

在这里插入图片描述

一、C++ 变量作用域

在C++中,变量的作用域(Scope)指的是变量在程序中可以被访问的区域。作用域由花括号{}定义,这些花括号可以出现在函数体、控制结构(如if语句、循环语句)或任何块级结构中。根据变量的定义位置,C++中的变量可以分为几种不同的作用域类型:

  1. 全局作用域(Global Scope)
  • 在所有函数外部定义的变量具有全局作用域。
  • 这些变量在程序的整个执行期间都是可见的,并且可以从程序的任何位置访问。
  • 尽量避免使用全局变量,因为它们可能导致代码难以理解和维护。
  1. 局部作用域(Local Scope)
  • 在函数内部或块(由花括号{}包围的代码块)内部定义的变量具有局部作用域。
  • 这些变量仅在其定义的函数或块内部可见和可访问。
  • 一旦离开定义它们的函数或块,这些变量将不再存在。
  1. 命名空间作用域(Namespace Scope)
  • 在命名空间中定义的变量具有命名空间作用域。
  • 这些变量在该命名空间内是可见的,但可以通过使用命名空间的名称来从外部访问。
  • 命名空间用于组织代码,避免命名冲突。
  1. 类作用域(Class Scope)
  • 在类内部定义的变量(成员变量)具有类作用域。
  • 这些变量只能通过类的对象或类的成员函数来访问。
  • 根据访问权限(public、protected、private),这些变量的可见性可以进一步限制。
  1. 块作用域(Block Scope)
  • 实际上,局部作用域和块作用域可以视为同一概念的不同表述。
  • 任何由花括号{}包围的代码块内部定义的变量都具有块作用域。
  1. 函数原型作用域(Function Prototype Scope)
  • 在函数原型中声明的参数名仅在函数原型内部具有作用域。
  • 这些名称在函数定义或函数体内部是不可见的。

理解变量的作用域对于编写高效、可维护的C++代码至关重要。正确地使用作用域可以避免命名冲突,提高代码的可读性和可维护性。同时,也要注意作用域的生命周期,确保在适当的时候释放不再需要的资源,以避免内存泄漏等问题。

二、局部变量

C++中的局部变量是在函数内部或代码块(由花括号{}包围的区域)中定义的变量。这些变量仅在定义它们的函数或代码块内部可见和可访问,一旦离开该作用域,这些变量就会被销毁,其占用的内存也会被释放(对于自动存储期的局部变量而言)。

下面案例,展示了局部变量的使用:

#include <iostream>// 函数声明
void printNumbers();int main() {// main函数中的局部变量int mainVar = 10;std::cout << "在main函数中,mainVar的值为: " << mainVar << std::endl;// 调用函数printNumbers();// 注意:这里不能访问printNumbers函数中的局部变量,因为它们的作用域仅限于该函数内部return 0;
}// 函数定义
void printNumbers() {// printNumbers函数中的局部变量int num1 = 5, num2 = 10;// 另一个代码块(if语句内部)if (num1 < num2) {// 这个变量仅在if语句的代码块内部有效int temp = num1 + num2;std::cout << "num1 + num2 = " << temp << std::endl;// 尝试在if语句外部访问temp会导致编译错误// std::cout << "temp的值为: " << temp << std::endl; // 错误:temp在此处不可见}// 在这里可以访问num1和num2,但不能访问tempstd::cout << "num1的值为: " << num1 << ", num2的值为: " << num2 << std::endl;// 函数结束,num1、num2和temp(如果它能在函数外部访问的话,但实际上不能)都将被销毁
}

在这个例子中,mainVarmain函数中的局部变量,而num1num2tempprintNumbers函数中的局部变量。temp变量是在if语句的代码块中定义的,因此它仅在该代码块内部可见和可访问。一旦执行离开if语句的代码块,temp变量就会被销毁,其占用的内存也会被释放。

注意,虽然局部变量在函数或代码块结束时会被销毁,但它们的销毁并不直接等同于内存的立即释放。内存的释放依赖于C++的运行时环境(如栈的弹出操作),这通常发生在函数返回或代码块执行完毕后。然而,对于动态分配的内存(使用new操作符分配的内存),则需要在适当的时候使用delete操作符来显式释放,以避免内存泄漏。局部变量通常不涉及动态内存分配,因此不需要程序员显式地释放它们占用的内存。

三、全局变量

在C++中,全局变量是在所有函数外部定义的变量,这意味着它们在程序的整个执行期间都是可见的,并且可以从程序的任何位置访问。但是,过度使用全局变量可能会导致代码难以理解和维护,因为它们可以在程序的任何地方被修改,从而引入难以追踪的错误。

下面案例,展示了全局变量的使用:

#include <iostream>// 全局变量定义
int globalVar = 100;// 函数声明
void modifyGlobalVar();
void printGlobalVar();int main() {// 在main函数中访问全局变量std::cout << "在main函数中,全局变量globalVar的初始值为: " << globalVar << std::endl;// 调用函数修改全局变量modifyGlobalVar();// 再次在main函数中访问全局变量,查看其值是否已改变std::cout << "在modifyGlobalVar函数执行后,全局变量globalVar的值为: " << globalVar << std::endl;// 调用另一个函数打印全局变量的值printGlobalVar();return 0;
}// 函数定义:修改全局变量的值
void modifyGlobalVar() {// 直接访问并修改全局变量globalVar = 200;std::cout << "在modifyGlobalVar函数中,全局变量globalVar的值已被修改为: " << globalVar << std::endl;
}// 函数定义:打印全局变量的值
void printGlobalVar() {// 访问并打印全局变量的值std::cout << "在printGlobalVar函数中,全局变量globalVar的值为: " << globalVar << std::endl;
}

在这个例子中,globalVar是一个全局变量,它在main函数、modifyGlobalVar函数和printGlobalVar函数中都是可见的。modifyGlobalVar函数修改了globalVar的值,然后在main函数中通过两次打印来展示这个变化。printGlobalVar函数也打印了globalVar的值,以进一步证明全局变量的全局可见性。

然而,尽管全局变量在某些情况下可能很方便,但通常建议尽可能避免使用它们,而是使用函数参数、返回值或类成员变量来传递和存储数据。这样可以提高代码的可读性、可维护性和可重用性。

四、类作用域

在C++中,类作用域(Class Scope)是指类内部定义的成员(包括成员变量和成员函数)的作用域。这些成员只能通过类的对象或者类的成员函数来访问(取决于成员的访问权限:public、protected或private)。

下面是一个C++类作用域的案例代码:

#include <iostream>
#include <string>// 定义一个名为Person的类
class Person {
private: // 私有成员,只能通过成员函数访问std::string name; // 私有成员变量int age; // 另一个私有成员变量public: // 公有成员函数,可以在类外部通过对象访问// 构造函数,用于初始化对象Person(std::string n, int a) : name(n), age(a) {}// 成员函数,用于设置名字void setName(std::string n) {name = n;}// 成员函数,用于获取名字std::string getName() const {return name;}// 成员函数,用于设置年龄void setAge(int a) {if (a >= 0) {age = a;}}// 成员函数,用于获取年龄int getAge() const {return age;}// 成员函数,用于打印个人信息void printInfo() const {std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};int main() {// 创建Person类的对象Person person1("Alice", 30);// 通过公有成员函数访问私有成员std::cout << "Initial info of person1: ";person1.printInfo();// 修改对象的属性person1.setName("Bob");person1.setAge(25);// 再次打印以查看修改后的信息std::cout << "Modified info of person1: ";person1.printInfo();// 创建另一个Person类的对象Person person2;// 注意:这里person2使用了默认构造函数(如果未定义,则编译器会生成一个),因此其成员变量可能未被初始化// 最好为所有类定义至少一个构造函数来初始化成员变量return 0;
}

在这个例子中,Person类有两个私有成员变量nameage,以及多个公有成员函数来访问和修改这些私有成员变量的值。注意,私有成员变量nameage不能直接从类外部访问,只能通过类的公有成员函数(如getNamesetNamegetAgesetAge)来访问和修改它们的值。

此外,Person类还定义了一个构造函数,用于在创建Person类的对象时初始化nameage成员变量。构造函数是一个特殊的成员函数,它在创建类的对象时自动调用。

最后,main函数中创建了两个Person类的对象person1person2,并通过调用Person类的公有成员函数来访问和修改这些对象的私有成员变量的值。注意,由于person2在创建时没有提供初始化参数,并且我们没有为Person类定义默认构造函数来初始化其成员变量,因此person2的成员变量可能处于未定义状态(这取决于编译器如何处理未初始化的局部变量)。在实际应用中,最好为所有类定义至少一个构造函数来初始化其成员变量。

五、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows安装jdk21

下载 下载zip解压 设置环境变量 设置JAVA_HOME环境变量 Path环境变量添加如下值%HAVA_HOME%\bin 打开新的cmd&#xff0c;输入java --version查看效果

恒创科技:HTTP错误码403禁止意味着什么,怎么修复它?

HTTP错误码403禁止意味着客户端无权访问特定网页或服务器。403 错误表示客户端存在问题&#xff0c;无论用户使用的是哪种网络浏览器&#xff0c;都可能发生这种情况。幸运的是&#xff0c;阻止服务器允许访问特定页面的问题通常可以修复。以下是一些常见原因和相应的解决方案。…

【ROS2】Ubuntu 24.04 源码编译安装 Jazzy Jalisco

目录 系统要求 系统设置 设置区域启用所需的存储库安装开发工具 构建 ROS 2 获取 ROS 2 代码使用 rosdep 安装依赖项安装额外的 RMW 实现&#xff08;可选&#xff09;在工作区构建代码 设置环境 尝试一些例子 下一步 备用编译器 Clang保持最新状态 故障排除 卸载 系统要求 当前…

滤波算法学习笔记

目录 引言 一、定义 二、分类 三、常见滤波算法 四、应用与优势 五、发展趋势 例程 1. 均值滤波&#xff08;Moving Average Filter&#xff09; 2. 中值滤波&#xff08;Median Filter&#xff09; 3. 高斯滤波&#xff08;Gaussian Filter&#xff09; 4.指数移动…

微信开发者工具报错 Error: module ‘xxx.js‘ is not defined, require args is ‘xxx.js‘

背景 报错如下 检查 代码逻辑和写法都是ok的重新打开项目又是可以的 解决方案 先确保微信开发者工具和uniapp的将js编译成es5都开着&#xff08;这个是默认开的&#xff09; 然后把微信开发者工具关了重开 一般做这一步就会好了&#xff0c;但是只是临时解决 &#xff08…

《Winodws API每日一练》8.2 static控件

在 Windows 编程中&#xff0c;"Static" 控件是一种常见的用户界面元素&#xff0c;用于显示静态文本或图像&#xff0c;而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素&#xff0c;不接受用户的…

秒懂设计模式--学习笔记(6)【创建篇-建造者模式】

目录 5、建造者模式5.1 介绍5.2 建造步骤的重要性5.3 地产开发商的困惑5.4 建筑施工方5.5 工程总监5.6 项目实施5.7 建造者模式的各角色定义5.8 建造者模式 5、建造者模式 5.1 介绍 建造者模式&#xff08;Builder&#xff09;又称为生成器模式&#xff0c;主要用于对复杂对象…

爬虫-豆瓣电影排行榜

获取数据 requests库 获取数据环节需要用到requests库。安装方式也简单 pip install requests 爬取页面豆瓣读书 Top 250 用requests库来访问 import requests res requests.get(https://book.douban.com/top250/) 解析&#xff1a; 导入requests库调用了requests库中的…

明星代言6个提升企业形象的杀手锏-华媒舍

在当今竞争激烈的商业世界中&#xff0c;企业形象的塑造对于品牌的发展至关重要。而明星代言作为一种常见的营销手段&#xff0c;被广泛使用来提升企业形象和产品销售。本文将介绍明星代言的六个杀手锏&#xff0c;帮助您了解如何通过明星代言来提升企业形象。 1. 拥有广泛的影…

关于虚拟机CentOS 7使用ssh无法连接(详细)

虚拟机CentOS 7使用ssh无法连接 猜测&#xff1a;可能是虚拟机软件的网关和和centos7的网关不同导致的问题。 首先打开CentOS7的终端, 输入ifconfig&#xff0c;查看一下系统的ip 打开虚拟机的虚拟网络编辑器, 查看一下网关, 发现确实不一样. 这里有两种方式, 要么修改虚…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出&#xff0c;所有版本VGG均全部使用33大小、步长为1的小卷积核&#xff0c;33卷积核同时也是最小的能…

Java | Leetcode Java题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isIsomorphic(String s, String t) {Map<Character, Character> s2t new HashMap<Character, Character>();Map<Character, Character> t2s new HashMap<Character, Character>(…

Java-数据结构

数据结构概述 常见的数据结构 栈 队列 数组 链表 二叉树 二叉查找树 平衡二叉树 红黑树 示例&#xff1a;

【Go】编译frp,绕过内网安全工具

文章目录 概述常用命令编译环境配置开发环境拉取依赖打包exe输出运行打包好的exe测试 绕过安全产品实践frp使用教程 本文所提供的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用。文章作者无法鉴别判断读者使用信息及工具的真实用途&#xff0c;若读者将文章中的…

2024 年第十四届 APMCM 亚太地区大学生数学建模 B题 洪水灾害的数据分析与预测--完整思路代码分享(仅供学习)

洪水是暴雨、急剧融冰化雪、风暴潮等自然因素引起的江河湖泊水量迅速增加&#xff0c;或者水位迅猛上涨的一种自然现象&#xff0c;是自然灾害。洪水又称大水&#xff0c;是河流、海洋、湖泊等水体上涨超过一定水位&#xff0c;威胁有关地区的安全&#xff0c;甚至造成灾害的水…

基于惯性加权PSO优化的目标函数最小值求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于惯性加权PSO优化的目标函数最小值求解matlab仿真。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09;…

使用java stream对集合中的对象按指定字段进行分组并统计

一、概述 有这样一个需求&#xff0c;在一个list集合中的对象有相同的name&#xff0c;我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求&#xff0c;这里做一个记录&#xff0c;希望对有需求的同学提供帮助 一、根据指定字段进行分组 一、先准备好给前端要…

三菱plc gxwork3 0X121201F 报错;三菱标签区域的保留容量不足;

如果占用过多把r文件寄存器的地址范围改小&#xff0c;一般文件寄存器的地址r0-8000足够了

zk集群搭建

zk集群在搭建部署的时候&#xff0c;通常选择2n1奇数台。底层 Paxos 算法支持&#xff08;过半成功&#xff09;。 zk部署之前&#xff0c;保证服务器基础环境正常、JDK成功安装。 服务器基础环境 IP主机名hosts映射防火墙关闭时间同步ssh免密登录 JDK环境 1、虚拟机克隆 …

014-GeoGebra基础篇-快速解决滑动条的角度无法输入问题

有客户反馈&#xff0c;他的Geogebra一直有个bug&#xff0c;那就是输入角度最大值时总不按照他设定的展示&#xff0c;快被气炸了~ 目录 一、问题复现&#xff08;1&#xff09;插入一个滑动条&#xff08;2&#xff09;选择Angle&#xff08;3&#xff09;输入90&#xff0c;…