Oct 11, 2010

拷贝构造和拷贝赋值

拷贝构造 T(const T& rhs)
拷贝赋值 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: