类的作用域和对象的生存期

#include <iostream>
using namespace std;
class X{
  public:
    X(int ii = 1){ i=ii; cout << "X (" << ii << ") created" << endl;}
    ~X(){ cout << "X (" << i << ") destroyed" << endl;  }
  private:
int i ;
};


class Z{
  public:
    Z():x3(3),x2(2){ cout << "Z created" << endl; }
    ~Z(){ cout << "Z destroyed" << endl; };
  private:
    X x1, x2, x3;
};
X a(200); //a的生命期开始了
void main (void){
    Z z;  //z的生命期开始了,且其成员对象x1\x2\x3的生命期也开始了,且先于它
    {
        X c(100); //c的生命期开始了
        static X b(50); //b的生命期开始了
    } //c的生命期结束了
} //z、x3、x2、x1、b的生命期依次结束

                      //main()函数结束后,a的生命期才结束





### C++ 中的作用域生存期 #### 变量的作用域 变量的作用域决定了程序中可以访问该变量的位置。C++ 支持多种不同型的变量作用域: - **局部变量**:定义在函数内部或复合语句内的变量称为局部变量,其作用域仅限于声明它的代码块内[^1]。 ```cpp void func() { int localVar; // 局部变量 { int innerVar; // 内层局部变量,在此大括号范围内有效 } // innerVar 在这里不可见 } ``` - **全局变量**:在整个文件范围可见并可被任何函数使用的变量被称为全局变量,通常在所有函数之外定义。 ```cpp int globalVar = 0; void setGlobal(int val) { globalVar = val; } int getGlobal() { return globalVar; } ``` - **静态局部变量**:当在一个函数体内使用 `static` 关键字修饰时,则创建了一个具有静态存储持续时间的局部对象;这变量初始化一次,并且在其整个程序运行期间都存在。 ```cpp void counterFunc() { static int count = 0; // 静态局部变量 ++count; std::cout << "Called " << count << " times\n"; } ``` - **成员变量**:属于某个特定实例的数据成员也拥有自己的作用域规则,可以通过对象名加上点操作符来访问它们。 #### 生存期(生命周期) 生存期指的是内存中的对象何时分配以及何时释放的时间段。主要分为三: - **自动生存期**:对于大多数情况下遇到的栈上分配的对象,默认遵循这一模式——即进入作用域时创建,离开作用域时销毁。这适用于所有的局部非静态变量。 - **静态生存期**:由关键字 `extern` 或者 `static` 声明的变量会一直存在于应用程序执行过程中直到结束为止。这意味着即使超出原始定义位置之后仍然能够保持之前的状态不变。 - **动态生存期**:通过运算符 new delete 明确控制堆上的资源获取回收过程所形成的对象生命周斯。程序员负责管理这些对象的生命期以防止泄漏等问题发生。 ```cpp class MyClass { public: ~MyClass(); // 析构函数用于清理工作 }; void dynamicLifetimeExample() { MyClass* pObj = nullptr; try { pObj = new MyClass(); // 使用 pObj } catch (...) { // 错误处理逻辑 } delete pObj; // 手动释放资源 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值