首页 > 其他分享 >85.局部对象

85.局部对象

时间:2023-05-05 20:34:00浏览次数:33  
标签:初始化 定义 ctr 对象 局部 作用域 85 函数

  在C++语言中,名字有作用域(参见2.2.4节,第43页),对象有生命周期(lifetime)。理解这两个概念非常重要。

●名字的作用域是程序文本的一部分,名字在其中可见。

●对象的生命周期是程序执行过程中该对象存在的一段时间。

  如我们所知,函数体是一个语句块。块构成一个新的作用域,我们可以在其中定义变量。形参和函数体内部定义的变量统称为局部变量(local variable)它们对函数而言是“局部的”,仅在函数的作用域内可见,同时局部变量还会隐藏(hide)在外层作用域中同名的其他所有声明中。

  在所有函数体之外定义的对象存在于程序的整个执行过程中。此类对象在程序启动时被创建,直到程序结束才会销毁。局部变量的生命周期依赖于定义的方式。

1.自动对象

  对于普通局部变品对应的对象来说,当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在的块末尾时销毁它。我们把只存在于块执行期间的对象称为自动对象 (automatic object)。当块的执行结束后,块中创建的自动对象的值就变成未定义的了。

  形参是一种自动对象。函数开始时为形参申请存储空间,因为形参定义在函数体作用域之内,所以一旦函数终止,形参也就被销毁。

  我们用传递给函数的实参初始化形参对应的自动对象。对于局部变量对应的自动对象来说,则分为两种情况:如果变量定义本身含有初始值,就用这个初始值进行初始化;否则,如果变量定义本身不含初始值,执行默认初始化(参见C++ Primer 2.2.1节,第40页)。这意味着内置类型的未初始化局部变益将产生未定义的值。

2.局部静态对象

  某些时候,有必要令局部变量的生命周期贯穿函数调用及之后的时间。可以将局部变量定义成static类型从而获得这样的对象。局部静态对象(local static object)在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。
  举个例子,下面的函数统计它自已被调用了多少次,这样的函数也许没什么实际意义,但是足够说明问题:

size t count calls() 
{
    static size_t ctr O;//调用结束后,这个值仍然有效
        return ++ctr; 
}

int main() 
{
    for (size_t i = O; 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,以此类推。
  如果局部静态变量没有显式的初始值,它将执行值初始化(参见C++ Primer 3.3.1节,第88页),内置类型的局部静态变量初始化为0。

参考资料

C++ Primer

标签:初始化,定义,ctr,对象,局部,作用域,85,函数
From: https://www.cnblogs.com/codemagiciant/p/17375293.html

相关文章

  • 01_java面向对象编程语言的思考
    java的跨平台在各个操作平台上,有一层JVM(java虚拟机),这是支撑java程序能够运行的基础。java源代码→(编译)→java字节码→(运行)→java虚拟机jdk:java开发工具包jre:java运行环境jvm:java虚拟机api:应用程序接口程序目录主要结构lib目录:存放Java的类库文件bin:java编译器,解释器工具......
  • 2023.5.5 面向对象程序设计实验报告
    实验项目名称:模板一、实验目的1、熟练掌握函数模板和类模板的定义格式。2、熟练运用函数模板和类模板解决实际问题。二、实验内容1、复数类Complex有两个数据成员:a和b,分别代表复数的实部和虚部,并有若干构造函数和一个重载-(减号,用于计算两个复数的距离)的成员函数。要求设计......
  • 4-20mA转RS485和转RS232的区别
    4-20mA信号是工业上常用的模拟信号,转换成数字信号通常有RS485接口和RS232接口。从软件方面来说,这两种接口软件是完全一样兼容的,采集的时候编程也不需要特殊的区别。直接modbusRTU协议通讯或者字符协议通讯。而硬件方面试有区别的,RS485采用的是半双工通讯,同一时间只能有一个设备发......
  • 类模板。。。对象数组
    #include<bits/stdc++.h>usingnamespacestd;template<classT>classAAA{      Ta,b;   public:      AAA(T_a,T_b):a(_a),b(_b){};      Tsum(){         returna+b;      }      Tcha();};template<......
  • numpy.ndarray.flatten-返回numpy对象的一维数组
    参考:https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flatten.html语法格式ndarray.flatten(order='C')order:“C”表示按行(C-style)顺序折叠。“F”表示按列(Fortran-style)顺序进行平化。'A'表示:如果A在内存中是Fortran连续的,则按列顺序平化,否则按行顺......
  • Kubernetes资源对象管理
    API对象:也就是K8S的资源对象,是K8S集群中的管理操作单元。K8S集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作。一、Kubernetes资源对象查询1.1查询资源类型#列出当前集群中所有的资源类型kubectlapi-resources   字段说明NAME:资......
  • BeatuifulSoup对象的创建
    1.lxml模块的使用: 2.创建BeautifulSoup对象: ......
  • java面对对象编程-内部类
    内部类内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对于B类来说就是外部类了。成员内部类静态内部类 局部内部类(写在方法里) 匿名内部类 外部类:用new,内部类:通过外部类来实例化内部类 内......
  • 记录-对象有哪些继承方式
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1.原型链温故而知新:构造函数、原型和实例的关系:  每个构造函数都有一个原型对象,原型有一个属性指回构造函数,实例有一个内部指针指向原型。思考:如果原型是另一个类型的实例呢?  那就意味着这个原型本身有一个......
  • python11:局部变量与全局变量
    局部变量:在函数内部定义的变量,作用域仅仅局限在函数的内部。不同的函数可以定义相同的局部变量,但是各自用各自的不会产生影响注意:局部变量在函数执行完毕后会释放作用:为了临时的保存数据,需要在函数中定义来进行存储。全局变量:当全局变量和局部变量出现重复定义的时候,程序就......