前言:看了好久Effective,但是感觉好多都是看了就忘,现在再看一边,顺便把一些易忘的记录下来,争取每天一记。
概念:Copying函数,包括copy constructor;copy assignment operator,对于默认的编译器生成版,会将被拷贝的对象的所有成员变量都做一份拷贝。
如果你自己声明一个copying函数,编译器就会以一种奇怪的方式回应:当你的实现代码几乎必然出错时却不告诉你.(不知道是作者原话还是译者,感觉挺有意思的)
该条款有两个需要注意的地方:1复制所有local成员变量2调用所有base classes内的copying函数。
第一个地方还好,比较容易理解,下面主要讲讲第二个->
- void logCall(const std::string& funcName); // make a log entry
- 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 { … }; // for dates in time
- class Customer {
- public:
- … // as before
- 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类的copying函数好像复制了PriorityCustomer内的每一样东西,它复制了PriorityCustomer声明的成员变量,但是其基类Customer成员变量却没有被复制(其实应该是没有按照相应的参数复制,而是使用了这些变量的default构造函数),这一点是尤其需要注意的,尤其是没有真正写过类似代码时很容易忽视这个问题,正确的写法是下面这样的:
- PriorityCustomer::PriorityCustomer(const PriorityCustomer& rhs)
- :Customer(rhs), // invoke base class copy ctor
- priority(rhs.priority)
- {
- logCall(“PriorityCustomer copy constructor”);
- }
- PriorityCustomer& PriorityCustomer::operator=(const PriorityCustomer& rhs)
- {
- logCall(“PriorityCustomer copy assignment operator”);
- Customer::operator=(rhs); // assign base class parts
- priority = rhs.priority;
- return *this;
- }
具体内容见Items12。