#include <iostream>
using namespace std;
class Base
{
public:
Base() { cout << "Constructor called" << endl; }
~Base() { cout << "Destructor called" << endl; }
};
void main()
{
Base();
Base b;
Base c;
}
/* 此程序输出:
Constructor called
Destructor called
Constructor called
Constructor called
Destructor called
Destructor called
*/
说明第一条Base()这条语句,调用了构造函数又马上调用了析构函数。
临时匿名对象的生存期被定在一句语句的结束。也就是到了下一行语句之前,临时匿名对象被销毁。关于这个生存期的问题标准委员会有过长时间的争论,最终确定这个方案。理由差不多是:有一个方案比没有这个方案强。
临时匿名对象通常为了简化代码。比如有个类X,包含一个成员函数f(),执行一个操作。你可以这么写:
X x_(100);
x_.f();
也可以这么写:
X(100).f();
总之,匿名对象一般常用在两个地方
1。new分配堆对象时
int *p= new int(5); //分配一个int匿名对象,用5初始化之
2。函数调用或返回时
A* test()
{
return new A(); //建一个匿名对象,并返回指向它的指针
}
或
void test(const Base& bs)
{
}
void main()
{
test(Base()); //用一个匿名的Base对象去调用test函数
}