您的位置:首页 > 编程语言 > C语言/C++

Effective C++学习笔记——构造/析构/拷贝运算

2013-10-02 22:58 204 查看
条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数。
应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会有相对应的实现。
原因: base class的构造函数会先被调用,而在base class 构造期间virtual函数绝不会下降到dedrived class阶层。事实上,C++的其它部分(dynamic_cast & typeid),在此期间也是一样的把对象视为base class。

解决办法:籍由”令derived class 将必要的构造信息向上(通过函数参数)传递至base class的构造函数“。可以在dedrived class中定义一个private static函数来得到该构造信息, 定义为static是为了避免使用尚未初始化好的dedrived class 成员。

条款10、11: 令assignment操作符返回一个reference to *this。同时注意在operator=中处理”自我复制“!
说明:operator=要考虑”自我复制安全性“和”异常安全性“。涉及的技术包括:比较”来源对象“和”目标对象“的地址、精心周到的语句顺序、以及copy-and-swap技术。

class A


{


...


private:


int *p;


}


//1 各种不安全


A& A::operator=(const A& rhs)


{


delete p;


p = new A(*rhs.p);


return *this;


}




//2 语句顺序的改变,带来“自我复制安全”(虽然也许不够高效)与“异常安全”。


A& A::operator=(const A& rhs)


{


 pOrig = p;


p = new A(*rhs.p);


 delete pOrig;


return *this;


}




//3 copy-and-swap技术


void A::swap(A& rhs)


{


...//交换*this与rhs


}


A& A::operator=(const A& rhs)


{


 A temp(rhs);


 swap(rhs);


return *this;


}




//4 巧妙伶俐的利用值传递在制造临时副本,即使有可能更为高效(在“函数参数构造”)却牺牲了清晰性。


A& A::operator=(const A rhs)


{


 swap(rhs);


return *this;


}


条款12:复制对象时勿忘其每一个成分
备注:不要尝试以某个copying函数来实现另一个copying函数(copy构造函数,operator=函数)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: