匿名对象与具名对象
2025/8/2大约 2 分钟
匿名对象与具名对象
平时我们经常会看到一些临时变量,这些变量只定义了一次且并没有被使用,通常这些变量是被用来管理或分析某个作用域。最近突然好奇:既然这些变量不会被使用,为什么要给这些变量定义名字?故浅浅探讨了一下。
1.匿名对象与具名对象的定义
匿名对象是指没有变量名的临时对象,通常是表达式直接产生的对象,只能在创建它的语句中使用一次,生命周期很短。
具名对象是通过变量名定义并保存的对象,可以被多次引用、访问、传参等,生命周期更长,控制权更强。
下面是定义两种对象的实例:
int(6);//匿名对象
int a(6);//具名对象2.使用案例
现在不妨定义一个类profiler,用于统计作用域的执行时间:
class profiler
{
public:
string name;
profiler(string name) :name(name),start_time(chrono::high_resolution_clock::now())
{
cout << "BEGIN Scope " << name << endl;
}
~profiler()
{
chrono::high_resolution_clock::time_point end_time(chrono::high_resolution_clock::now());
long long duration = chrono::duration_cast<chrono::microseconds>(end_time - start_time).count();
cout << "END Scope " << name << " after " << duration << " us" << endl;
}
private:
chrono::high_resolution_clock::time_point start_time;
};接下来在两个作用域内执行相同的操作,但是分别使用了匿名对象和具名对象:
int main()
{
{
profiler("test1");
cout << "作用域1内操作" << endl;
}
cout << endl;
cout << endl;
{
profiler test2("test2");
cout << "作用域2内操作" << endl;
}
}最终执行的结果是:
BEGIN Scope test1
END Scope test1 after 460 us
作用域1内操作
BEGIN Scope test2
作用域2内操作
END Scope test2 after 916 us可以发现:
匿名对象在构造完成后,离开当前语句会立即调用析构函数;
具名对象会持续到离开作用域时才执行析构。
