C++ 函数作用域

Qt代码-软件商店 ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString())); 阅读详情

变量作用域

局部作用域、全局作用域、文件作用域

 

局部变量:也称内部变量,声明在函数内(包括main函数),作用域开始于变量声明之处,结束于函数或块结束处;

 

全局变量:也称外部变量,声明在函数外,作用域一般是整个程序源文件,作用域最广,甚至可以作用于组成该程序的所有源文件(比如,将多个独立编译的源文件链接成一个程序时,在某个源文件中声明的全局变量,在与该源文件相链接的其他源文件中也可以使用,但使用前必须进行extern全局声明。这样,多个源文件中的所有函数都能使用全局变量,在一个函数中改变了一个全局变量的值,就会作用到使用该全局变量的其他所有函数,相当于各函数之间有了一条直接传递数据的通道。当然这也破坏了独立性)

 

文件作用域:在函数外部声明的变量只在当前文件范围内(包括文件内所有定义的函数)可用,在其他文件不可用。要使变量具有文件作用域,必须在变量的声明前加static关键字。当多个源文件链接成一个程序时,static可以避免一个文件中的全局变量与其它文件中的变量同名而发生冲突。

 

在同一作用域内的变量不能同名,但在不同作用域内的变量可用同名,在本作用域会覆盖/屏蔽其它作用域的同名变量。(我的地头我做主)

 

1. static全局变量和普通全局变量区别?

在全局变量声明前加static -> static全局变量,全局变量本身是静态存储方式,静态全局变量也是静态存储方式,在存储方式上无区别。

主要区别在于非静态全局变量的作用于是整个源程序(由多个源程序组成的话,在各个源文件中都有效);静态全局变量限制了作用域,只在定义该变量的源文件中有效(全局作用域->文件作用域),可避免在其他文件中引起错误。static变量只初始化一次,下一次依照上一次的值

 

2. static局部变量和普通局部变量区别?

在局部变量声明前加static -> 静态局部变量,存储方式改变了,局部变量是动态存储,静态局部变量是静态存储方式,也就是改变了它的生存期,由函数内部或者块内部变为文件作用域,虽然并不是真正的“文件作用域”,声明在函数内,但是在函数外部无法访问,作用应该只是为了避免重名冲突。

 

PS: 静态局部变量扩大了局部变量的生存期,静态全局变量缩小了全局变量的作用域

 

3. static函数与普通函数区别?

静态函数与普通函数作用域不同,仅在本文件。内部函数:只在当前源文件中声明和定义的函数称为内部函数(static);对于可在当前源文件以外使用的函数,应该在头文件中说明,或者进行extern全局声明。static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

 函数的存储类型

分为内部函数(static) 和外部函数(extern)两类。内部函数:只能被同一个源文件中的函数所调用;外部函数:可以被其他源文件中的函数所调用。

没有定义存储类型的函数默认extern。

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

变量的存储类型

任何变量都有数据类型和存储类型两种属性。完整的变量声明,除了声明代表变量运算属性的数据类型,有时还需要声明代表变量存储方式的存储类型。

除了分配内存空间大小,还要分配不同类型的内存空间。

变量的存储类型决定了C++编译器为变量分配内存的方式,决定了变量的生存期

 

准确来说,变量的生存期和作用域是从不同角度分析变量的属性。

 

变量的作用域:空间范围,从代码空间角度,哪段代码看得见,哪段代码看不见。关键是“可见性”和“可用性”。

变量的生存期:从代码的执行时间角度考虑,是指在程序执行的过程中变量从创建到被撤销的一段时间,即变量的生命周期。当变量被分配了内存空间,就处于生存期;当所占的内存空间被释放,这个变量就结束了生存期。关键是“存活状态”。

 

最明显的就是静态局部变量。

// 静态局部变量使用

void fun()

{

static int a;//静态变量a是局部变量,但具有全局变量的生存期

a++;

cout << "a = "<< a<<endl;

}

 

int main()

{

for(int i = 0; i < 2; i++)//静态变量a不在作用域内

fun();

}

结果是

a = 1

a = 2

 

分析:声明静态变量时如果没有初始化,则“初始化”值为0,静态全局变量的初始化是在执行main之前完毕,静态局部变量的初始化是在程序运行后第一次执行该变量的声明语句时进行。

 

 

下例:在MyFunc()中第一个声明的局部变量(x=1)在随后的语句块中虽然处于生存期(因为声明和定义它的MyFunc()函数块还没有结束),但不在作用域,因为被语句块内同名的局部变量x(2)屏蔽(/覆盖)了,但是一旦语句块结束,x(2)的生存期也就结束了,在MyFunc()内只有x = 1生存。局部变量x(2),y(2)虽然在语句块内生存,但进入函数FuncA()后也是不可用的。

 

void MyFunc(){

int x = 1;

{

int x(2),y(2);//变量" x = 1"失去作用域

cout << "x = "<<x<<"\n";

FuncA(); //变量X(2),Y(2)进入函数后失去作用域

}

}

 

内存的分配方式:自动分配,静态分配,动态分配,所占内存区域和变量类型如下:

 



静态分配
:编译时就分配了内存地址,运行时变量就占用内存,知道程序结束时变量才释放内存。 

 

动态分配:利用堆(heap)这个内存块为变量分配内存,堆使用了除栈、静态存储区之外的自由存储空间。是一种完全由程序自身控制内存分配的方式(控制包括开辟空间new、释放空间delete

 

对于非动态内存分配方式的变量,决定变量采用哪种内存分配方式,是由声明变量时指定存储类型和声明语句在程序中的位置决定的。

C++变量的存储类:

auto, register, extern, static

声明时可指定:

<存储类型>  <数据类型>  <变量名列表>;

 

auto int a;

static float b,c;

 

registerauto声明局部变量:register存储在寄存器,auto存储在栈

extern声明全局变量,static声明全局变量和局部变量

externstatic都在静态存储区。

 

没有指定存储类型,默认如下:

局部变量:auto

全局变量:extern

 

 

全局变量:定义性声明和引用性声明

定义性声明定义变量,分配内存空间。只能在函数外部,一般不加extern

引用性声明表示变量已经在程序源文件中其他地方进行过定义性声明(已分配空间)。可以放在函数外,也可以放在函数内,要加extern,一般不能对变量初始化,除非定义性声明没有初始化。

 

程序有多个源文件组成,如果每个文件都要使用同一个全局变量,在每个文件中都要进行全局变量的声明,但如果是定义性声明,编译每个源文件不会出错,链接它们则出现重复定义错误。所以方法是在一个源文件中进行定义性声明,其它文件引用性声明。

基于simulink构建一个完整的航空航天器姿态控制与导航仿真模型 航空航天器的姿态控制与导航系统是确保飞行器稳定运行和精确执行任务的核心技术。其目标是通过传感器获取飞行器的状态信息,并利用控制器调整飞行器的姿态,使其按照预定轨迹飞行。基于MATLAB/Simulink平台进行航空航天器姿态控制与导航系统的建模与仿真,可以帮助研究者验证算法性能并优化系统的动态响应。本项目旨在构建一个完整的航空航天器姿态控制与导航仿真模型,包括飞行器动力学建模、传感器模块设计、控制器实现以及导航算法仿真,并通过仿真分析其性能。 阅读详情

相关推荐

C++函数与变量作用域深入解析

本文深入探讨C++函数变量的作用域问题,包括局部变量、全局变量以及静态变量的概念和用法。通过代码示例和程序运行结果,阐释了局部变量的生命周期、作用域限定以及全局变量和静态变量在程序中的持久性和可访问性。同时,介绍了作用域解析运算符的使用场景和函数与指针结合以实现多值返回的技巧。...

weixin_35094083的博客 437

C++作用域详细解读

C++离不开一个重要的概念那就是作用域作用域C++语言非常重要的一个概念,接下来我们就一起看看C++作用域。学好C++作用域必须理解透彻,这样才能用好!

jiexijihe945的博客 3961

C++函数重载与作用域解析

本文详细介绍了C++中的函数重载和作用域的概念。通过示例代码,展示了如何根据参数类型选择合适的函数重载,并解释了局部作用域、块作用域以及对象的生命周期和存储时长。内容涵盖了从基础函数定义到函数重载的高级应用,再到变量作用域和生命周期的深入理解。

weixin_42611310的博客 381

C++作用域 (一)

C++作用域 (一)1概述2作用域的分类2.1概述2.2名字空间作用域2.2.1名字空间的意义2.2.2名字空间的定义2.2.3名字空间成员的定义2.2.4名字空间成员的使用2.2.6 标准名字空间std2.2.5名字空间的嵌套2.2.6未命名名字空间 1概述 在所有的计算机程序中,一个基本的目标是操作一些数据,然后获得一些结果。为了操作这些数据,需要为这些数据分配一段内存,我们可以将这段内存称为变量。为了方便操作,以及程序可读性方面的考虑,需要使用一个有意义的名称来引用这段内存,这个名称就是变量名。 将名

Ternence_zq的博客 4524

C++作用域

 1、全局作用域:    当变量是在所有函数的外部声明的,称其为外部变量,它具有全局作用域(即可以在程序的任何地方访问它);全局作用域的变量/函数可以在独立编译的代码模块中使用,前提是要在使用他的模块中用extern关键字对他们进行声明。2、局部作用域;   在函数内部或者在某一模块内声明,不能被其他函数模块访问的变量,还有函数的形参都具有局部作用域。在c++中支持不同作用域

zhangmiaoping23的专栏 1254

C++作用域、变量作用域、生命周期和变量分类介绍

C++作用域、变量作用域和变量分类介绍。 变量作用域(Variable Scope)是指变量的生命周期和可见性,也就是变量在程序中的哪些部分可以使用。按照作用域(Scope)变量可分类为全局变量和局部变量。 还可按照生命周期(Lifetime)进行分类变量可分类为静态变量(Static Variables)和成员变量(Member Variables)。

cnds123的专栏 6516

c++】的作用域 (局部域,类域,名字命名空间,文件域)

c++作用域 局部域,类域,名字命名空间,文件域

aoeaoao的博客 2136

C++ 入门03:函数作用域

今天的学习内容则是C++中的函数作用域。这部分内容是编写模块化代码和管理变量范围的关键。函数,作为任何一门编程的基石之一,它允许我们将代码分割成可重用的独立块,每个块都执行特定的任务。

LF__plus的博客 1543

C++作用域函数重载

C++作用域函数重载

BebopPrimer的博客 583

C++系列——C++函数作用域

对于C++来说啊常用的函数有普通函数、内联函数、递归函数等。你可以根据自己的需求来选择合适的函数类型哦!比如如果你需要定义一个简单的函数来计算两个数的和就可以这样写:int add(int a, int b) { return a + b;}这样一来啊你就可以在程序中多次调用add函数来计算任意两个数的和啦!对于C++来说啊常见的作用域有全局作用域、局部作用域和命名空间作用域等。你可以根据自己的需求来选择合适的作用域哦!总之啊C++中的函数作用域虽然有点复杂但只要你掌握了基本概念就一定能够搞定哦!

为科技与折腾而奋斗 661

C++学习笔记:函数的重载与作用域

之前我讲了函数的重载相关的知识C++学习笔记:函数的重载 今天将以下关于重载的作用域 一般情况下,每一个版本的函数重载都应该在同一个作用域中声明 但是有种情况是:如果其中一个函数的声明做了一个局部的声明,那么这种情况就叫做‘函数屏蔽’,而不是函数的重载!! 在讲函数屏蔽(函数隐藏)之前,我们先来看一下变量屏蔽 如下例所示: #include<iostream> #include<...

Peter_Red_Boy的博客 2960

c++中的作用域 四类(函数原型作用域,局部作用域,类作用域,命名空间作用域

1.函数原型作用域: 此作用域c++程序中最小的作用域,生存周期最短。 例:int func(int i) i为参数,作用域类型为函数原型类型。 2.局部作用域

Create_Queue的博客 1万+

C++学习系列(3):C++函数作用域

掌握函数的使用可以让代码更清晰、更模块化,提高程序的可读性和复用性。🚀。

Azperk的博客 592

C++基础之函数作用域

(1)函数的定义格式如下所示。<类型><函数名>(<形参表>) {<若干条语句>}其中,<类型>包含存储类和数据类型。存储类省略为外部函数,加static为内部函数;数据类型又称函数返回值的类型,不可省略。<函数名>同标识符,<形参表>中可以有一个或多个参数,多不参数用逗号分隔,也可以没有参数。以上是函数头。函数体是由一对花括号括起来的若干条语句。如果函数体内无语句,称为空函数。(2)函数的说明方...

weixin_33995481的博客 319

C++函数(3):变量作用域

L2C++自学第3课,这次的课程由创作助手编写,所以没有作业

keda4134的博客 313

C++ main函数的返回值、标识符的作用域、变量的生存期、宏与内联函数

C++ main函数的返回值 main函数通过返回值把整个程序的执行情况告诉调用者(通常是操作系统,但是操作系统通常会忽视main函数的返回值),一般情况下return 0表示正常结束,return -1表示非正常结束。 main函数也可以不写return语句,这时当执行完最后一条语句后自动执行一条“return 0;”语句。 其他函数的返回值原理同此。 C++ 标识...

huang714的专栏 1008

C++的虚函数作用域

1.作用域的说明: 每个类定义自己的作用域,在这个作用域内我们定义类的成员。当存在继承关系时,派生类的作用域是嵌套在其基类的作用域内。如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义。 2.虚函数说明: 当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,因为我们直到运行时才能知道调用了哪个版本的虚函数,所以所有虚函数都必须有定义。通常

wk_bjut_edu_cn的博客 712

C++内联函数作用域运算符 ::

内联函数

mougai的博客 627

C++ 类成员函数中的静态变量的作用域

本来的一个想法是C++ 的类的成员函数是属于这个类的,那么这个类的成员函数中的静态变量也是属于这个类的。不过越想越感觉不对劲,于是写了个测试代码,试了一下。还真不对,结果是类的成员函数中的静态变量,他的作用域是这个成员函数,不管是不是这个类的同一个实例化对象,他们都共用这一个静态变量。也就是说函数的静态变量还是跟C 一样的解释。 直接给出测试代码吧。 // test.h #ifndef

su_787910081的专栏 8396

C++ 类成员函数作用域以及构造函数初始值列表

名字查找与类的作用域: 普通查找方式: 在名字所在的块中寻找声明,只考虑在语句之前的声明 如果没找到继续查找外层作用域,也是语句之前的声明 如果没找到,程序报错 定义在类内部的成员函数 首先编译成员的声明(声明中的名字,函数返回类型和参数列表) 直到类全部可见后编译函数体 成员函数中的名字按下面的方式解析 在成员函数内查找该名字的声明,只有使用之前出现的声明 才被考虑 如果在成员函数内没...

adventural的博客 780

Matlab实现在多径信道下OFDM-DCSK调制,.rar

1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

上一篇: 学习C++等编程语言的网站
下一篇: C++ 动态分配内存
ForestRound
博客等级 码龄12年 30粉丝 76原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值