拷贝赋值 T& operator=(const T& rhs)
这两个函数是必有的。你不提供的话,编译器有默认的实现。
编译器默认的实现,遵守如下原则
- 拷贝构造和赋值中,复制每一个成分:1. 如果有继承,则复制基类成员(见后面代码);2. 每一个成员变量
- 拷贝构造中,使用成分(基类成员和成员变量)的拷贝构造;同样的
- 拷贝赋值中,使用成分(基类成员和成员变量)的拷贝赋值
如果自己编写函数,也要遵守
什么情况下要自己编写函数:
1. 成员中含有指针
P* ptr;
则拷贝构造和赋值中都使用 P 的拷贝构造
此时拷贝赋值有两种做法
其一是
P* temp = new P(*rhs.ptr);
delete ptr.
ptr = temp;
其二是
*ptr = *rhs.ptr;
class B { public: B() {} ~B() {} B(const B& b) { cout << "copy construct" << endl; } B& operator=(const B& b) { cout << "copy assingment" << endl; return *this; } }; class A: public B { public: A() {} ~A() {} A(const A&a):B(a) { } A& operator=(const A&a) { B::operator =(a); return *this; } }; int main() { A a1; A a2(a1); A a3; a3 = a2; return 0; }
0 comments:
Post a Comment