拷贝赋值 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