标签: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