C++中常用的几个小技巧

也许只是一些技巧而已,不过值得反复重用就变成语言的 Idioms了。说到Idioms,POSA认
为 Pattern 可以分为三个层次(或者粒度) ,Architecture patterns、Design patterns、Programming
language Idioms。也就是说Idioms很多是跟语言相关的。 
 
1、实现抽象类(不允许实例化) 
这个可能大家都知道,把构造函数声明为 protected。 (当然如果类中包含纯虚函数自然就不
能实例化,但是有的抽象类需要为虚函数提供缺省实现,因此可能不包含纯虚函数。 )  
 
2、实现 final类(不允许被派生) 
namespace Private{
class NonDerivableHelper
{
        NonDerivableHelper() {}
        friend class NonDerivable;
};
}
#ifdef NDEBUG
#define FINAL_CLASS
#else
#define FINAL_CLASS : private virtual Private::NonDerivableHelper
#endif
 
class NonDerivable FINAL_CLASS
{
    ...
};
  这里 namespace 并非必须,只是一个比较好的习惯而已。

3、实现禁止拷贝构造和赋值操作符 
class MyClass 

private:
MyClass(const MyClass& ); 
const MyClass& operator = ( const MyClass& ); 
};
为了防止成员函数调用操作,这两个函数应该只有声明没有实现。 
 
C++中的 Idioms很多很多,比如 TypeTraits、SmartPointer这些都可以视为经典的 Idioms。
注: 关于第二个实现 final类的方式, 只要是 virtual 继承即可, 至于是private、 protected
还是public关系不大。在 comp.lang.c++.moderated(2001/5/15)上,Andrei Alexandrescu有他
的见解,他不赞成上面文章中使用的 friend-based 方式,直接去掉 friend 那一行,这时必须采用
private virtual 继承方式。private virtual 继承确实使得没有任何类能只继承
NonDerivable。
 
class D: public NonDerivable
{
  D() {} //编译错误
}
 
不过多重虚拟继承又绕了过去
class D FINAL_CLASS, public NonDerivable
{
  D() {} //一切正常
}
 
  Andrei Alexandrescu又提出了一个非常巧妙的办法: 把 Private::NonDerivableHelper
的构造函数加一个参数,改为 NonDerivableHelper(int) {},然后把 NonDerivable 的
构造函数写成 NonDerivable(): NonDerivableHelper(0) {}
 
#ifdef NDEBUG
#define FINAL_CLASS
#else
#define FINAL_CLASS : private virtual Private::NonDerivableHelper
#endif
 
namespace Private
{
    class NonDerivableHelper
    {
    protected:
        NonDerivableHelper(int) {} //ADDED CTOR ARGUMENT
    };
}
 
class NonDerivable FINAL_CLASS
{
public:
  NonDerivable() : NonDerivableHelper(0) {} //PASS A DUMMY VALUE
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值