【发布时间】:2016-07-15 05:40:07
【问题描述】:
我知道每当一个对象超出范围或删除编译器会自动调用析构函数,但我怎么知道一个对象的范围呢?
例如在这段代码中:
#include<iostream>
using namespace std;
class demo
{
static int count;
public:
demo()
{
cout<<"object created"<<++count<<endl;
}
~demo()
{
cout<<"object destroyed"<<count--<<endl;
}
};
int demo::count;
int main()
{
cout<<"in main\n";
demo d1;
{
cout<<"in block 1\n";
demo d2;
{
cout<<"in block 2\n";
demo d3;
}
}
{
cout<<"in block 3\n";
demo d4;
}
cout<<"exit\n";
}
每个对象的作用域是什么?
【问题讨论】:
-
您是否尝试过实际编译和运行这段代码?
-
按顺序执行:构造函数被调用:demo d1 -> demo d2 -> demo d3 -> demo d4。析构函数被调用:-> demo d3 -> demo d2 -> demo d4 -> demo d1。发生这种情况的原因是,每个 { } 在堆栈帧上都有自己的一组开始和结束地址。每次遇到新对象时,都会在必要的范围({})下创建它。当您离开该范围时,它会被析构函数调用(除非它被分配或配置为静态变量。)所以每个的输出:
-
Constructors && Destructors Combined-> 对象已创建 1 个对象已创建 2 个对象已创建 3 个对象已销毁 3 个对象已销毁 2 个对象已创建 2(表示对象 4)已销毁对象 2(表示对象 4)已销毁对象 1 个只是看代码,可能这里或那里有问题。
标签: c++