# 局部对象 在C++语言中,名字有作用域,对象有**生命周期**(lifetime)。 - 名字的作用域是程序文本的一部分,名字在其中可见。 - 对象的生命周期是程序执行过程中该对象存在的一段时间。 函数体是一个语句块。块构成一个新的作用于,我们可以在其中定义变量。形参和函数体内部定义的变量统称为**局部变量(local variable)**。它们对函数而言是“局部”的,仅在函数的作用域内可见,同时局部变量还是会**隐藏(hide)** 在外层作用域中同名的其它所有声明中。 在所有函数体之外定义的对象存在于程序的整个执行过程中。此类对象在程序启动时被创建,直到程序结束才被销毁。局部变量的生命周期依赖于定义方式。 ## 自动对象 对于普遍局部变量对应的对象来说,当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在的块末尾时销毁它。我们把只存在于执行期间的对象称为**自动对象(automatic object)**。当块的执行结束后,块中创建的自动对象的值就变成未定义的了。 形参是一种自动对象。函数开始时为形参申请存储空间,因为形参定义在函数体作用域之内,所以一旦函数终止,形参也就被销毁。 我们用传递给函数的实参初始化形参对应的自动对象。对于局部变量对应的自动对象来说,则分为两种情况:如果变量定义本身含有初始值,就用这个初始值进行初始化;否则内置类型的未初始化局部变量将产生未定义的值。 ## 局部静态对象 某些时候,有必要令局部变量的生命周期贯穿函数调用后及之后的时间。可以将局部变量定义成static类型从而获得这样的对象。**局部静态对象(loca static object)** 在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。 举个例子,下面的函数统计它被调用多少次,没什么实际意义,但足够说明问题: ```cpp size_t count_calls() { static size_t ctr = 0; return ++ctr; } int main() { for(size_t i = 0 ; i <= 10 ; ++i) cout << count_calls() << endl; return 0; } ``` 这段程序将输出从1到10(包括10在内)的数字。 在控制流第一次经过ctr的定义之前,ctr被创建并初始化为0.每次调用将ctr加1并返回新值。每次执行count_calls函数时,变量ctr的值都已经存在并且等于函数上一次退出ctr的值。因此第二次调用ctr的值是1,第三次调用ctr的值是2,以此类推。 如果局部静态变量没有显示的初始值,它将执行**值初始化**,内置类型的局部静态变量**初始化为0**。 Loading... # 局部对象 在C++语言中,名字有作用域,对象有**生命周期**(lifetime)。 - 名字的作用域是程序文本的一部分,名字在其中可见。 - 对象的生命周期是程序执行过程中该对象存在的一段时间。 函数体是一个语句块。块构成一个新的作用于,我们可以在其中定义变量。形参和函数体内部定义的变量统称为**局部变量(local variable)**。它们对函数而言是“局部”的,仅在函数的作用域内可见,同时局部变量还是会**隐藏(hide)** 在外层作用域中同名的其它所有声明中。 在所有函数体之外定义的对象存在于程序的整个执行过程中。此类对象在程序启动时被创建,直到程序结束才被销毁。局部变量的生命周期依赖于定义方式。 ## 自动对象 对于普遍局部变量对应的对象来说,当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在的块末尾时销毁它。我们把只存在于执行期间的对象称为**自动对象(automatic object)**。当块的执行结束后,块中创建的自动对象的值就变成未定义的了。 形参是一种自动对象。函数开始时为形参申请存储空间,因为形参定义在函数体作用域之内,所以一旦函数终止,形参也就被销毁。 我们用传递给函数的实参初始化形参对应的自动对象。对于局部变量对应的自动对象来说,则分为两种情况:如果变量定义本身含有初始值,就用这个初始值进行初始化;否则内置类型的未初始化局部变量将产生未定义的值。 ## 局部静态对象 某些时候,有必要令局部变量的生命周期贯穿函数调用后及之后的时间。可以将局部变量定义成<kbd>static</kbd>类型从而获得这样的对象。**局部静态对象(loca static object)** 在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。 举个例子,下面的函数统计它被调用多少次,没什么实际意义,但足够说明问题: ```cpp size_t count_calls() { static size_t ctr = 0; return ++ctr; } int main() { for(size_t i = 0 ; i <= 10 ; ++i) cout << count_calls() << endl; return 0; } ``` 这段程序将输出从1到10(包括10在内)的数字。 在控制流第一次经过ctr的定义之前,ctr被创建并初始化为0.每次调用将ctr加1并返回新值。每次执行count_calls函数时,变量ctr的值都已经存在并且等于函数上一次退出ctr的值。因此第二次调用ctr的值是1,第三次调用ctr的值是2,以此类推。 如果局部静态变量没有显示的初始值,它将执行**值初始化**,内置类型的局部静态变量**初始化为0**。 最后修改:2024 年 03 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝 赞 3 如果觉得我的文章对你有用,请随意赞赏
81 条评论
没有屋顶的房子
布塔达姆巴斯卡纳拉亚纳
最强壮的人
地道战1965
我们之间的爱
七百万元大劫案
封魔纪之赤雷传
世界将颤抖
LOL惊喜冬季时装秀
python教程
方世玉续集粤配
星际旅行5终极先锋
拉姆齐范德堡案件
林荫路825号
战锋尖峰对决
命运理发师
六月里来好阳光
防线秘密护送
火烧圆明园
最后的美洲豹
上海滩之猛龙闯金关
聊斋之极道天师
假如爱有天意
音乐是怎么变成免费午餐的
哈利波特与密室
去他的爱再次中招
这是汤姆格林的纪录片
荒岛惊魂1966
环游地球八十天
德克斯特的实验室自大之旅
孙神探与黑寡妇的诅咒
与神同行2因与缘
暗潮汹涌之惊魂12小时
盲女惊魂记
东北美发天团
我心脏机器人
水班长许东奎
猎杀u571
盛大的家庭圣诞节
爱的暂停键
封魔纪之赤雷传
比尔马赫还有其他人看到这个吗
恶魔恐怖现身
钢之炼金术师完结篇复仇者斯卡
银河护卫队3
尼罗河风暴
真实泰勒斯威夫特和特拉维斯凯尔西爱情故事还是反英雄
狮子王木法沙传奇
长生不死硅谷富豪的逆龄人生
水班长许东奎
只有我能喜欢你
告诉我你想要什么
白头神探智斗灭世狂人
拉拉队员都死了
狮子王木法沙传奇
精装追女仔之3狼之一族粤配
大宋断狱神手之陈情伞
偷食抢食搵饭食
ktv火热的女人2
凶杀重案实录纽约第二季
提着心吊着胆
唐伯虎点秋香
css教程
七百万元大劫案
完美perfect
我的西门小故事
第三帝国邪恶的欺骗
大漠追云剑
七令诡事录
十年一品温如言
巴黎属于我们
羞羞的铁拳
木匠的祈祷
火烧圆明园
唐人街探案3
河水冲洗我
再见金钱前往贫困村
古董计中计之龙璧之战
白日之下粤配
文章中的实用建议和操作指南,让读者受益匪浅,值得珍藏。
研究方法科学,数据支撑充分,结论可靠。