程序员

[C++进阶]复制对象时勿忘其每个部分

2020-09-07  本文已影响0人  小鱼号的代码日记

前言:
设计良好的面向对象系统(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个具体做法
*****/
上一篇下一篇

猜你喜欢

热点阅读