读书人

请问深入了解C++的前辈(临时对象有关

发布时间: 2012-03-16 16:34:56 作者: rapoo

请教深入了解C++的前辈(临时对象问题)
代码如下:
class A
{
public:
A(){ cout < < "default constructor " < < endl; }
A( int n ) { cout < < "constructor " < < endl; }
A& operator = ( A& a )
{
cout < < "= " < < endl;
return *this;
}
virtual ~A() { cout < < "destructor " < < endl; }
};
int main()
{
{
map <int,A> m;
m[ 4 ] = A( 1 );
}return 0;
}
输出:
constructor
default constructor
destructor
destructor
=
destructor
destructor
请问:
1.里边只调用了2个构造函数,但调用了4次析构函数,另两个对象是拷贝构造函数创建的吗?是谁的拷贝构造函数?是A的还是pair的?
2.4个对象的创建是在什么时候?何时析构?

谢谢!



[解决办法]
constructor
default constructor
copy constructor
copy constructor
destructor
destructor
=
destructor
destructor
准确的应该是这样,
可以看出另二个对象是默认的copy constructor创建的。
这四个对象里有三个是临时对象,在执行完[ 4 ] = A( 1 );这一句后就析构了,
还一个是放到map中的对象,在main函数返回时析构


[解决办法]
m[ 4 ] = A( 1 );

1. A(1) 调用A(int)
2. 因为m[4]不存在,按照STL标准,要先创建一个m(4, A())
3. 要创建一个m(4, A()),需要创建一个pair <int, A> 的对象,然后插入map
4. 需要产生一个pair类型临时变量,于是产生类似代码
pair <int, A> tmp(4, A());
5. 这里,在pair的构造函数的参数里,先调用A()默认构造一次,产生一个A类型临时变量。
6. 然后,在pari的构造参数中(实际是初始化列表里),以A类型临时变量为参数,初始化pair的second成员变量,于是此处调用copy constructor一次。
7. 最终,调用map::insert函数,以pair类型临时变量(tmp)为参数。
8. 在map::insert函数中,创建新的A类型实例,以pair类型临时变量(tmp)中的second成员变量为参数,于是此处又调用copy constructor一次。

综合以上,就得到了这样的输出结果:
constructor
default constructor
copy constructor
copy constructor

读书人网 >C++

热点推荐