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可以发现:
 匿名对象在构造完成后,离开当前语句会立即调用析构函数;
 具名对象会持续到离开作用域时才执行析构。
