局部对象,static局部对象,static全局对象

为分清这些,我们先看一段代码:

#include<iostream>
static int global_sta = 1;  //global_sta为静态全局对象
void print()
{
    int non_local = 2;      //non_local为局部对象,非静态的
    static sta_local = 3;   //sta_local为静态局部对象
}

非静态局部对象

特点:

  • 在定义它的函数中可以使用,函数外不可访问

  • 存储位置在栈区

  • 当函数的控制路径经过变量定义语句时创建该对象,当到达定义所在块的末尾时销毁它


static局部对象

特点:

  • 函数内的static对象

  • 存储位置在全局数据区

  • 定义它的函数中可以访问,函数外不可访问

  • 在程序执行路径第一次经过对象定义语句时初始化(就是说多次调用它所在函数,只有第一次经过这个static对象初始化语句时才初始化它,其它时候忽略),如下函数:

size_t count_calls()
{
    static size_t ctr = 0;//调用结束后,这个值依然有效;第二次调用count_calls函数时
                          //不会初始化ctr,ctr的值是1
    return ++ctr;
}
  • 不会随着函数结束而消失,整个程序结束才消失

static全局对象

特点:

  • 定义在全局,或namespace范围内,或一个class中,或一个文件作用域中

  • 存储位置在全局数据区

  • 只有该源文件能访问,其他cpp文件不能访问

  • 整个程序结束时消失。


总结

  1. 定义位置
    局部对象,static局部对象定义在函数内,static全局对象定义在函数外
  2. 存储位置
    局部对象存储在栈区,static局部对象和static全局对象存储在全局数据区
  3. 访问作用域
    局部对象和static局部对象只能在函数内被访问;static全局对象能在全局被访问
  4. 销毁时间
    局部对象在函数末尾销毁,static局部对象和static全局对象在程序结束时销毁

.

总结局部对象static局部对象static全局对象
定义位置函数内函数内函数外
存储位置栈区全局数据区全局数据区
访问作用域只能函数内被访问只能函数内被访问能全局被访问
销毁时间函数末尾程序结束时程序结束时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值