读书人

求教stl中map的对象赋值过程(无opera

发布时间: 2012-02-12 17:16:34 作者: rapoo

求教stl中map的对象赋值过程(无operator=定义却能正常赋值)
这几天看对象模型,结合手头上做的一个程序,有需要结构用到map的赋值,如下面代码:

C/C++ code
class NODE{public:    int state;    int id;    unsigned long    RouteTable[2][32];         map<unsigned long, unsigned long> mapMM;};


如果有:

C/C++ code
NODE n1, n2;n1.RouteTable[0][0] = 1;n1.mapMM.insert( map<unsigned long, unsigned long>::value_type( 1,1 ) );n1.mapMM.insert( map<unsigned long, unsigned long>::value_type( 2,2 ) );n2 = n1; //进行整个对象赋值n2.RouteTable[0][0] = 2;n2.mapMM.insert( map<unsigned long, unsigned long>::value_type( 3,3 ) ); 


通过 n2 = n1; n1 与 n2 输出的值互不影响。问题是:
1.在没有提供 copy-constructor 的情况下,编译器又有需要时,会自己加插,以memberwise(逐个成员数据)方式,递归用bitwise复制,但是如果内部有动态内存分配的情况,这样情况应该会出错,但是为什么这里的map复制没问题呢?(我们都知道map内部是以红黑树实现,肯定会存在有动态内存分配)

2.再深入看map的定义,在vc2005的stl里,也没有operator=的定义,但是竟然能够正够的赋值了,非常不解。
为了安全起见,现在是自己为NODE加上了operator=:
C/C++ code
class NODE{public:    int state;    int id;    unsigned long    RouteTable[2][32];         map<unsigned long, unsigned long> mapMM;     NODE& operator=( NODE& rhs )     {         if( this == &rhs )             return *this;          id= rhs.id;         state = rhs.state;              mapMM.insert( rhs.mapMM.begin(), rhs.mapMM.end()  );  //是不是多余了呢?         return *this;     }        };


高分救解~~~~

[解决办法]
既然知道是memberwise copy,那就只要每个member都有正确的operator=就行了.

STL经过很多测试,不会不安全的.
[解决办法]
1. "这样情况应该会出错," 应该会出什么错??? 这里使用浅拷贝就行了,只要正确指向动态分配的内存就行了。
2. 没有自己定义拷贝构造函数或赋值操作符,没有程序编译运行不会有什么问题,问题在于逻辑上,它是不是你需要的。
[解决办法]
1.是会调用红黑树结构的复制构造函数。

2.operator=是有重载的。你这里的mapMM.insert( rhs.mapMM.begin(), rhs.mapMM.end() ); 完全多余,而且不但多余,而且你这里完全不是起到operator=的作用。你这里是在原有的元素的基础上再插入新的元素。
[解决办法]
map没重载= 太不可思异了 我去看看
==========
有一点你错了,编译合成的赋值函数不是位拷贝,是调用类成员的赋值函数,如果类成员没赋值函数才调用位拷贝
[解决办法]
红黑树重载=了吧。
[解决办法]
楼主看来面向对象的思想不过关哦。

首先在说正题以前,举一个简单的例子:

C/C++ code
class A{  A(const A&)  {     cout << "A copy construct"<<endl;  }  A& operator=(const A& a)  {     cout <<"A operator= called"<<endl;  } .........};A a;A b=a;//拷贝构造A c;c=a;//等号重载int a1;int b1=a1;int c1;c1=a1; 

读书人网 >C++

热点推荐