首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-16 
请教深入了解C++的前辈(临时对象问题)代码如下:classA{public:A(){cout defaultconstructor endl}

请教深入了解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

热点排行