前言:
设计良好的面向对象系统(OO-system)会将对象的内部封装起来,
只留两个函数负责拷贝,那便是带着适切名称的copy构造函数和copy
assignment操作符。
统称为copying函数
如果你声明自己的copying函数需要注意
1 如果你为class 添加一个成员变量,你必须同时修改copying函数
2 让derived class的copying函数调用相应的base class函数
3 如果你发现你的copy构造函数和copy assignment操作符有相近的代码。
消除重复代码的做法是,建立一个新的成员函数给两者调用。
这样的函数往往是private而且常被命令为init。
这个策略可以安全消除copy构造函数和
copy assignment操作符之间的重复代码
/***************************
effectivre c++
改善编程与设计的55个具体做法
条款12:复制对象时勿忘其每个部分
---------小鱼号的代码日记--------------
****************************/
/*
前言:
设计良好的面向对象系统(OO-system)会将对象的内部封装起来,
只留两个函数负责拷贝,那便是带着适切名称的copy构造函数和copy
assignment操作符。
统称为copying函数
如果你声明自己的copying函数需要注意
1 如果你为class 添加一个成员变量,你必须同时修改copying函数
2 让derived class的copying函数调用相应的base class函数
3 如果你发现你的copy构造函数和copy assignment操作符有相近的代码。
消除重复代码的做法是,建立一个新的成员函数给两者调用。
这样的函数往往是private而且常被命令为init。
这个策略可以安全消除copy构造函数和
copy assignment操作符之间的重复代码
*/
#include <QCoreApplication>
#include <iostream>
using namespace std;
class Customer
{
public:
Customer(const Customer & rhs)
:name(rhs.name)
{
}
Customer& operator=(const Customer & rhs)
{
if(this == &rhs)
return *this;
name = rhs.name;
return *this;
}
private:
std::string name;
int type; //添加一个成员变量,你必须同时修改copying函数
};
class pCustomer :public Customer
{
public:
pCustomer(const pCustomer & rhs)
:Customer(rhs),
priority(rhs.priority)
{
}
pCustomer& operator=(const pCustomer & rhs)
{
if(this == &rhs)
return *this;
Customer::operator =(rhs);
priority = rhs.priority;
return *this;
}
private:
int priority;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
/*****
内容选自:
effectivre c++
改善程序与设计的55个具体做法
*****/
网友评论