more effective c++——Item M30 代理类(三)隐式类型转换与代理类
2017-05-06 17:18
656 查看
代理类的缺点:
1.作为函数返回值,代理类的临时对象(比如proxychar)会带来构造与析构的开销
2.代理类存在类型转换的问题,如果原始类A可以隐式转换为类B,则代理类即使存在隐式转换为A的方法,也不能直接转换为B
3.如果要像操作原始类一样操作代理类,则必须为代理类提供相同的接口
根据第二点的特性,我们可以设计一个转换的代理类来防止隐式类型(另一种方式是将单参构造函数声明为explicit)。比如有一个类CArrayInt,开始设计如下:
使用:
上面的操作肯定是存在问题的,我们原本希望对ci[2]进行赋值,如果我们写出了上面的代码,希望编译器会报错,但是不然。因为ci2[2]返回的是一个int,可以通过CArrayInt 的单参构造函数转换为一个临时的CArrayInt 对象,因此ci1 == ci2[2]实际上等价于ci1 == CArrayInt(ci2[2])。如何避免这个问题?答案就是通过代理类ArraySize实现,加入代理类后的代码如下:
1.作为函数返回值,代理类的临时对象(比如proxychar)会带来构造与析构的开销
2.代理类存在类型转换的问题,如果原始类A可以隐式转换为类B,则代理类即使存在隐式转换为A的方法,也不能直接转换为B
3.如果要像操作原始类一样操作代理类,则必须为代理类提供相同的接口
根据第二点的特性,我们可以设计一个转换的代理类来防止隐式类型(另一种方式是将单参构造函数声明为explicit)。比如有一个类CArrayInt,开始设计如下:
class CArrayInt { public: CArrayInt(int size) :m_size(size), m_data(new int[m_size]) {} int &operator[](CArrayInt &rhl){...} CArrayInt &operator=(const CArrayInt &rhl){...} bool operator==( const CArrayInt &lhs,const CArrayInt &rhs); ~CArrayInt() { delete[] m_data; } private: int m_size; int *m_data; };
使用:
CArrayInt ci1(5);// 构造一个CArrayInt 对象 CArrayInt ci2(5); // do something if(ci1 == ci2[2]){ //do otherthing }
上面的操作肯定是存在问题的,我们原本希望对ci[2]进行赋值,如果我们写出了上面的代码,希望编译器会报错,但是不然。因为ci2[2]返回的是一个int,可以通过CArrayInt 的单参构造函数转换为一个临时的CArrayInt 对象,因此ci1 == ci2[2]实际上等价于ci1 == CArrayInt(ci2[2])。如何避免这个问题?答案就是通过代理类ArraySize实现,加入代理类后的代码如下:
class CArrayInt { public: class ArraySize { public: ArraySize(int size) :m_size(size) {} int m_size; }; CArrayInt(ArraySize &size) :m_size(size.m_size), m_data(new int[m_size]) {} ~CArrayInt() { delete[] m_data; } private: int m_size; int *m_data; };void test_proxy_constructor() { CArrayInt ci1(CArrayInt::ArraySize(5));// ok ci1 = 8;// error,int类型不可以直接转换为CArrayInt,只有ArraySize才可以 }
相关文章推荐
- more effective c++——Item M30 代理类(二)通过代理类识别operator[]的读写操作
- 利用重载避免隐式类型转换(More Effective C++_21(效率))
- more effective c++笔记1-----Item M2:尽 量使用C++风格的类型转换
- More Effective C++ (条款21:利用重载技术避免隐式类型转换)
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- More Effective C++----(21)通过重载避免隐式类型转换
- more effective c++——Item M30 代理类(一)多维数组的实现
- More Effective C++ 阅读笔记(四)-- 避免使用隐式类型转换
- 《More Effective C++》 Item M2:尽量使用C++风格的类型转换
- More Effective C++:类型转换
- More Effective C++ 阅读笔记(二) -- C++的新型类型转换(造型Cast)
- more effective c++ 第一章读书笔记: 指针,引用,c++类型转换,多态数组,默认构造函数
- 读书笔记 effective c++ Item 24 如果函数的所有参数都需要类型转换,将其声明成非成员函数
- [More Effective C++]尽量使用C++风格的类型转换
- Effective C++ Item 46 需要类型转换时请为模板定义非成员函数
- 隐式类型转换与非成员函数(effective C++ 条款24&46)
- More effective C++ 今日一贴 之C++类型转换[1]
- More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态
- More Effective C++议题【二】:尽量使用C++风格的类型转换
- C++之谨慎定义类型转换函数(针对隐式类型转化)(4)---《More Effective C++》