author:
- luixiao1223
title: 复制对象时勿忘其每一个成分
如果自己写构造函数。添加成员,和参数。可能导致要修改很多 重载 构造函数。
void logCall(const std::string& funcName);
class Customer {
public:
Customer(const Customer& rhs);
Customer& operator=(const Customer& rhs);
private:
std::string name;
};
Customer::Customer(const Customer& rhs)
: name(rhs.name) // copy rhs’s data
{
logCall("Customer copy constructor");
}
Customer& Customer::operator=(const Customer& rhs)
{
logCall("Customer copy assignment operator");
name = rhs.name;
return *this;
}
到目前为止,很好。但是如果
class Date { ... };
class Customer {
public:
private:
std::string name;
Date lastTransaction;
};
记在心里:
添加了新的变量。你需要为每一个可能的构造,拷贝函数处理新参数。
如果有继承, 基类参数变化 会更麻烦。
class PriorityCustomer: public Customer // a derived class public:
{
PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator=(const PriorityCustomer& rhs);
private:
int priority;
};
PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
: priority(rhs.priority)//基类没有进行复制
{
logCall("PriorityCustomer copy constructor");
}
PriorityCustomer& PriorityCustomer::operator=(const PriorityCustomer& rhs)
{
// 基类没有进行复制
logCall("PriorityCustomer copy assignment operator");
priority = rhs.priority;
return *this;
}
如何解决
PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
: Customer(rhs), //调用基类的构造函数
priority(rhs.priority)
{
logCall("PriorityCustomer copy constructor");
}
PriorityCustomer& PriorityCustomer::operator=(const PriorityCustomer& rhs)
{
logCall("PriorityCustomer copy assignment operator");
Customer::operator=(rhs); //调用基类的赋值拷贝函数
return *this;
}
注意事项
- 不要那copy 构造函数调用拷贝赋值函数。
- 反之也不要。
如果你想复用某些代码。抽象出来做为一个单独的函数放到private里面即可。