复制对象时勿忘其每一个成分
1.Copying函数应该确保复制“对象内的所有成员变量”及所有”base class”成分 如果你为class添加一个成员变量,你必须同时修改copying函数。
当一个derived 类继承自 base class,若其copying函数内没有复制base class的对象,也即derived class的copy构造函数并没有指定实参传给base class的构造函数,因此derived class的base成分会被不带实参的base class构造函数初始化。
2、不该令copy assignment调用copy构造函数,反之亦然
有时出于精益求精的态度,可能会在copy assignment函数中调用copy构造函数,减少重复代码,但是这样是不合理的。当copy construct和copy assignment有近似代码时,应该建立一个新的private成员函数给两者使用。
如果类中没有定义复制构造函数和赋值构造函数,编译器会为我们提供默认的赋值和复制构造函数,但是如果你自己定义了这些函数,
但是数据没有全部copy,编译器是不会提醒你的
看下面的代码
假设我们为了描述一个顾客,定义了以下类
class Customer
{
public:
Customer(const Customer& rhs) :m_name(rhs.m_name)
{
}
Customer& operator=(const Customer& rhs)
{
m_name = rhs.m_name;
return *this;
}
Customer() = default;
Customer(string name) :m_name(name)
{
}
void show1()
{
cout << m_name << endl;
}
private:
std::string m_name{"##"};
};
上面的代码是OK的没有问题的,但是如果在类中添加了一个成员变量Data RegTime(注册时间),如果不对前面的代码加以修改,编译器和链接器也是不会报错的,这就很严重了
如果发生继承,可能会发生更加严重的问题
我们相对客户的优先级(星级)进行分类
```cpp
class PriorityCustomer :public Customer
{
public:
PriorityCustomer(const PriorityCustomer& rhs) : m_priority(rhs.m_priority)
{
Customer::operator=(rhs);
}
PriorityCustomer& operator=(const PriorityCustomer& rhs)
{
m_priority = rhs.m_priority;
return *this;
}
PriorityCustomer(string name, int m_ority) :Customer(name), m_priority( m_ority)
{
}
void show()
{
show1();
cout << m_priority << endl;
}
private:
int m_priority;
};
这样的代码看起来没有问题,但是,却忽略了baseclass的成分
所以正确的写法是
PriorityCustomer(const PriorityCustomer& rhs) : m_priority(rhs.m_priority)
{
Customer::operator=(rhs);
}
PriorityCustomer& operator=(const PriorityCustomer& rhs)
{
Customer::operator=(rhs);
m_priority = rhs.m_priority;
return *this;
}
```cpp
void main()
{
PriorityCustomer p("jack",12);
p.show();
cout << "\\\\\\\n";
PriorityCustomer p2(p);
p2.show();
system("pause");
}
结果(没有执行operator=()):调用了基类的默认初始值
结果(执行operator=()):
补充:
接下来给Ax增加:
给Bx增加:
main中:
结果: