读书人

STL对象作为函数参数的一些疑义求讨

发布时间: 2013-08-16 14:29:57 作者: rapoo

STL对象作为函数参数的一些疑问,求讨论
自定义了一个类:
class TMy
{
public:
TMy()
{
TRACE("constructor\n");
m_pName = NULL;

}
int x;
int y;
char *m_pName;
~TMy()
{
TRACE("desconstructor\n");
if(NULL != m_pName)
{
free(m_pName);
m_pName = NULL;
}

}

TMy(const TMy &my)
{
TRACE("copy constructor\n");

}

TMy operator = (const TMy &my)
{
TRACE("assignment\n");
}
};

然后创建了一个map容器:
map<int, TMy *> mymap;
TMy *pMy = new TMy();
pMy->x = 1;
pMy->y = 10;
mymap.insert(pair<int, TMy*>(pMy->x, pMy));
这里创只是建对象的时候调用了一次构造函数,可以理解,insert时直接把pMy对象的指针保存到容器中。
如果是:
map<int, TMy> mymap;
TMy my;
my.x = 1;
my.y = 10;
//my.m_pName = (char *)malloc(10);
mymap.insert(pair<int, TMy>(my.x, my));
在insert插入元素的时候调用了3次拷贝构造函数(没看insert源码,也不知道为什么要拷贝3次),那么像TMy这样需要深拷贝的类没有自己实现拷贝构造函数,用在容器中且不是很危险?不知道我这种分析对不对?

//////////////////////////
问题2:
如果将STL作为函数的参数:
int FindElement( map<int, TMy*> mymap, int iValue);
在调用该函数的时候:
FindElement(testmap, 8);
按照道理mymap是形参,应该将testmap的map元素都复制到形参mymap中,可是直接复制到mymap 中的是testmap中每个元素对象的地址,这样在函数FindElement中还是可以改变testmap中元素的值,我要想不允许改变,该如何定义参数呢?const在这个地方不会用了。

读书人网 >VC/MFC

热点推荐