自动对象和静态局部对象

1、自动对象
默认情况下,局部变量的生命期局限于所在函数的每次执行期间。只有当定义它的函数被调用时才存在的对象称为自动对象。自动对象在每次调用函数时创建和撤销。该类型局部变量存储在栈上,在动态存储区。
局部变量所对应的自动对象在函数控制经过变量定义语句时创建。如果在定义时提供了初始化,那么每次创建对象时,对象都会被赋予指定的初值。对于未初始化的内置类型局部变量,其初值不确定。当函数调用时结束,自动对象就会被撤销。
形参也是自动对象,其所占存储空间在函数调用时被创建,在函数结束时撤销。
2、静态局部对象
用static关键字修饰的局部变量。静态局部变量存储在静态存储区,生命期贯穿整个程序运行期间。作用域同自动局部变量。静态局部对象在所处模块初次运行时进行初始化工作,且只初始化一次。如果不初始化,编译器会自动为其赋初始值为0或空字符。

如:

 1 #include <iostream>
 2 using namespace std;
 3
 4 int gel(void){
 5     static int cnt = 0;
 6     return cnt++;
 7 }
 8
 9 int main(void){
10     for(int i = 0; i < 10; i++){
11         cout << gel() << " ";
12     }
13     cout << endl;
14     //输出 0 1 2 3 4 5 6 7 8 9
15     return 0;
16 }

第一点:对C++程序员来说,“变量”和“对象”一般可以互换使用。
第二点:两者有明显区别,形参和函数体内部定义的变量统称为局部变量,局部变量的生命周期依赖于定义的方式。一个普通的局部变量就是自动对象,但一个静态局部变量就不是自动对象,因为它不会在程序执行到它定义所在的块的末尾时就被销毁。

时间: 2024-10-09 08:37:20

自动对象和静态局部对象的相关文章

C++静态局部对象

7.5局部对象 在C++语言中,对于每一个变量和对象,都有其各自的作用域和生存期,这两个概念一个是空间的,一个是时间的.对象的作用域指的是该变量的程序文本区,对象的生存期则是程序执行过程中对象存在的时间. 7.5.1自动对象 只有当定义它的函数被调用的时候才存在的对象称为自动对象,自动对象在每次调用函数时创建和销毁. 局部变量所对应的自动对象在函数控制经过变量定义语句时创建.如果在定义时提供了初始化,那么每次创建对象时,对象都会被初始化为指定的初值.对于未初始化的内置类型局部变量,其初值是不确定

7.4——函数声明,局部对象,内联函数

函数声明: (1)函数在调用之前必须先声明,一个函数可以被声明多次,而只能被调用一次. (2)函数返回值,函数名,函数形参这三个组成函数原型,函数原型描述了函数接口. (3)在头文件中提供函数声明,而在定义函数的的源文件需要包含这个头文件. 局部对象: (1)函数定义的形参和变量的名字只位于函数的作用域中,这些名字只在函数体中可见. (2)自动对象包括函数形参和局部变量,生命周期只存在于函数的执行期间. 静态局部对象(static) (1)若是一个对象位于函数的作用域内,但生命周期存在于函数的多

C++——内存对象 禁止产生堆对象 禁止产生栈对象

用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针. 我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.那么这些不同的内存对象有什么区别了?堆对象和栈对象各有什么优劣了?如何禁止创建堆对象或栈对象了? 一.基本概念 先来看看栈. 栈,一般用于存放局部变

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &

c/c++不能返回局部对象和局部变量的指针或引用解释

在编写c/c++代码时,调用函数的书写让程序变得整洁易读,但是调用函数的返回值(局部变量的返回值,变量,结构体,数组等)也有注意事项.c/c++严禁返回局部变量的指针或引用. 其实函数的返回值的规则非常好记: 函数的返回值可以是数值和全局变量的指针或引用. 函数的返回值不能是局部对象或者是局部变量的指针或引用!!! 原因: 调用函数的局部变量是存在于栈中的,在执行完调用函数之后会将局部变量的空间释放,也就是调用函数执行后局部变量将不存在与内存中.如果返回的是局部变量的指针或者是引用.返回给接收对

Ogre 编辑器三(自动生成与更新Ogre对象编辑界面)

最开始设计这个编辑器时,其中一个要求就是能在运行过程中,通过UI来更新各对象,这样我们就能明确每个Ogre对象更新其属性影响的渲染效果.比如点光源,方向光源,聚光灯各属性与效果,深度测试开启与关闭,深度比较方式影响的效果等等.如下先看效果图: 这个位置没有用上一篇天龙的场景,主要是图片大小限制,场景复杂后,生成的gif图片太大. 这个功能当时我主界面完成后,就准备做的,但是当时一时想不到好的方案,如果针对每个Ogre属性来生成UI,然后关联每个对象,再想想后续如果要修改其中的字段属性或是位置,这

函数绝对的不要返回指向局部对象指针或引用,该返回对象就返回对象。

首先我们来看一个例子: #include <iostream> using namespace std; const int &fun1(int a,int b) { int i=0; i = a + b; return i; } int main() { if (fun1(1, 2) == fun1(2, 5)) { cout << fun1(1, 2) << endl; cout << fun1(2, 5) << endl; cout

ARC模式下操作对象无效,检查对象是否被自动释放掉

原文链接: ARC模式下操作对象无效,检查对象是否被自动释放掉 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/MajorLMJ iOS开发者公会-技术1群 QQ群号:87440292 iOS开发者公会-技术2群 QQ群号:232702419 iOS开发者公会-议事区   QQ群号:413102158

c++返回函数局部对象的引用

    函数千万不要返回局部对象的引用或指针 局部变量在函数里面,当函数执行结束后将释放局部变量,如果返回引用或批针这个时候引用或指针指向所指向的内存空间已经释放.指针和引用将是垂悬指针.很危险! 但是如果返回的"局部变量"是堆中的内存值就可以返回了 C++函数为什么要使用引用? C语言之中大量利用指针作为形参或者函数返回值,这是由于值拷贝会有很大的消耗(比如传入传出一个大的结构体).所以在C++之中使用引用作为函数参数和返回值的目的和使用指针是一样的.而且形式上更加直观,所以C++提