APIs往往要求访问原始资源(raw resource),所以每一个RAII class应该提供一个“取得管理资源”的办法
对原始资源的访问可以有显式转换和隐式转换。
显式转换比较安全;
隐式转换比较方便;
显式转换:
智能指针的get()函数
隐式转换:
智能指针的operator->和operator*
FontHandle getFont(); //C API
void releaseFont(FontHandle fh); //C API
void changeFontSize(FontHandle f, int newSize);//C API
//自定义RAII资源管理类
class Font{
public:
explicit Font(FontHandle fh):f(fh){}//pass-by-value C API这样做
~Font(){releaseFont(f);} //释放资源
FontHandle get()const {return f;}//显式转换
operator FontHandle() const{return f;}//隐式转换
private:
FontHandle f;//原始资源
};
//调用
Font f(getFont());
int size;
...
changeFontSize(f.get(), size);//显式调用
changeFontSize(f, size);//隐式调用,方便
//隐式误用
Font f1(getFont());
...
FontHandle f2 = f1;//想拷贝一个Font对象,却将f1隐式转换后复制
boost::shared_ptr的显式bool值转型
explicit operator bool() const;