标签:c++ effective c++ 语法优化
继续上一篇...
(二).构造/析构/赋值运算
____________________________________________________________________________________________________________________________________
条款11:在operator= 中处理 “自我赋值"
#1.确保当对象自我赋值时 operator=有良好行为。其中包括”自我赋值安全性”和Widget& Widget::operator=(const Widget& rhs) { Bitmap* pOrig= pb; pb = new Bitmap(*rhs.pb); delete pOrig; return *this; }由于”自我赋值“的证同测试会使原始码和目标码增大,并引入判定控制流,故若
另外,copy-and-swap技术也是处理“自我赋值”的一个解决方案。
#2.确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其
行为仍然正确。____________________________________________________________________________________________________________________________________
(1).复制所有local成员变量。(2).调用所有base classes 内的适当的copying函数。
通常这个函数取名init.
____________________________________________________________________________________________________________________________________
(三).资源管理
____________________________________________________________________________________________________________________________________
void f() { while(somecase) { Investment* pInv = createInvestment(); //createInvestment()是工厂函数,pInv是基类指针,指向派生类对象 ... delete pInv; } }若在...中有return语句,类似的,在...中有continue或goto语句,将会导致程序
人员很有可能会在...中误加入return,continue或goto,从而导致这种情况。)
(极有可能在分离期间抛出异常)
//Investment* createInvestment(); std::tr1::shared_ptr<Investment> pInv(createInvestment()); std::auto_ptr<Investment> pInv(createInvestment());
____________________________________________________________________________________________________________________________________
copying行为决定了RAII对象的copying行为。
class Lock:private Uncopyable{ public: ... }施行引用计数法:
void lock(Mutex* pm); void unlock(Mutex* pm); class Lock{ public: explicit Lock(Mutex* pm): //以Mutex初始化shared_ptr, mutexPtr(pm, unlock) //并以unlock作为删除器 { lock(mutexPtr.get()); } private: std::tr1::shared_ptr<Mutex> mutexPtr; }当class Lock发生copying行为时,将会复制mutexPtr,增加引用计数,而调用编译器
class Lock{ public: explicit Lock(Mutex* pm): //以Mutex初始化auto_ptr mutexPtr(pm) { lock(mutexPtr.get()); } private: std::auto_ptr<Mutex> mutexPtr; }
____________________________________________________________________________________________________________________________________
一个“取得其所管理的资源”的方法。
class Font{ public: explicit Font(FontHandle fh):f(fh){} ... FontHandle get() const { return f;} //显示转换 operator FontHandle() const {return f;} //隐式转换 private: FontHandle f; }
____________________________________________________________________________________________________________________________________
表达式中不使用[],一定不要在相应的delete表达式中使用[]。
(通过operator delete)。
个内存单元记为该“数组大小记录”。
____________________________________________________________________________________________________________________________________
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());对于C++编译器,new Widget发生于tr1::shared_ptr构造函数之前,
std::tr1::shared_ptr<Widget> pw(new Widget); processWidget(pw, priority());这样就可以保证编译器选择的执行顺序在new Widget和tr1::shared_ptr构造函数
之间是紧密链接的,从而解决了资源泄漏问题。
____________________________________________________________________________________________________________________________________
标签:c++ effective c++ 语法优化
原文地址:http://blog.csdn.net/beyond_ray/article/details/43668413