More Effective C++ 条款5 对定制的"类型转换函数"保持警觉
2015-06-26 03:07
323 查看
1. C++ 允许内置数据类型之间(例如char和int,int和double等)进行隐式转换,对于内置类型之间的隐式转换有详细的规则,但不管怎样,这些都是语言提供的,既相对安全,我们又无法更改(也就是说,这些我们不用管也管不着);
对于自定义的类类型,隐式转换可以通过带单一自变量的构造函数和隐式类型转换操作符来实现(所谓"单一自变量指的是可以有多个参数,但除了第一个参数其他参数必须有默认实参)
2. 对于自定义类型的类型转换,有一个规则:”没有任何一个转换程序可以内含一个以上的‘用户定制转换行为’(亦即单自变量constructor亦即隐式类型转换操作符)“,也就是说,必要的时候编译器可以先进行内置类型之间的转换再调用带但自变量的构造函数或者先调用隐式类型转换操作符在进行内置类型之间的转换,但不可能连续进行两次用户定制的类型转换!
3. 隐式类型转换操作符type()意味着"需转则转,能转则转",也就是说,由于隐式转换过于灵活,某些情况下会导致类的设计者并不想出现的行为。例如设计者定义了一个有理数类Rational,同时定义了 operator int(),而没有定义<<,这种情况下如果对于语句"cout<<a;",编译器应该报错来提醒设计者,但实际上a会被转为int然后输出,这背离了设计者的初衷。
因而最好不要定义隐式类型转换操作符,取而代之的方法是定义像"double toDouble()"的函数来执行类型转换的功能,虽然使用时有些许不遍,但"可因为不再默默调用那些不打算调用的函数而获得弥补”。C++标准库中的string类从没有string到char* 的隐式类型转换操作符而采用c_str函数可能就是这个原因。
4. 对于单自变量的构造函数由于隐式的转换可能会出现更加隐蔽的错误,例如:对于一个Array<int>对象,以下代码可能是正确的:
View Code
其中ArraySize被称为proxy(代理人) class(见条款30) ,这样唯一的缺点是在使用单一参数构造对象时中间加了一层转换,不过是值得的。
5. 总结允许编译器执行隐式转换弊大于利,所以非必要不要提供转换函数!
对于自定义的类类型,隐式转换可以通过带单一自变量的构造函数和隐式类型转换操作符来实现(所谓"单一自变量指的是可以有多个参数,但除了第一个参数其他参数必须有默认实参)
2. 对于自定义类型的类型转换,有一个规则:”没有任何一个转换程序可以内含一个以上的‘用户定制转换行为’(亦即单自变量constructor亦即隐式类型转换操作符)“,也就是说,必要的时候编译器可以先进行内置类型之间的转换再调用带但自变量的构造函数或者先调用隐式类型转换操作符在进行内置类型之间的转换,但不可能连续进行两次用户定制的类型转换!
3. 隐式类型转换操作符type()意味着"需转则转,能转则转",也就是说,由于隐式转换过于灵活,某些情况下会导致类的设计者并不想出现的行为。例如设计者定义了一个有理数类Rational,同时定义了 operator int(),而没有定义<<,这种情况下如果对于语句"cout<<a;",编译器应该报错来提醒设计者,但实际上a会被转为int然后输出,这背离了设计者的初衷。
因而最好不要定义隐式类型转换操作符,取而代之的方法是定义像"double toDouble()"的函数来执行类型转换的功能,虽然使用时有些许不遍,但"可因为不再默默调用那些不打算调用的函数而获得弥补”。C++标准库中的string类从没有string到char* 的隐式类型转换操作符而采用c_str函数可能就是这个原因。
4. 对于单自变量的构造函数由于隐式的转换可能会出现更加隐蔽的错误,例如:对于一个Array<int>对象,以下代码可能是正确的:
class Array{ public: class ArraySize{ public: ArraySize(int numElements): theSize(numElements){} private: int theSize; }; Array(ArraySize size); ...... };
View Code
其中ArraySize被称为proxy(代理人) class(见条款30) ,这样唯一的缺点是在使用单一参数构造对象时中间加了一层转换,不过是值得的。
5. 总结允许编译器执行隐式转换弊大于利,所以非必要不要提供转换函数!
相关文章推荐
- More Effective C++ 条款4 非必要不提供 default constructor
- C++面试中的singleton类
- 面试时做过的几个C/C++笔试题
- c++编程注意事项
- C++对象内存分布(1) - 私有虚函数
- C\C++代码优化的27个方法
- 【学习笔记】【C语言】指向函数的指针
- More Effective C++ 条款3 绝对不要以多态(polymorphically)方式处理数组
- 【学习笔记】【C语言】返回指针的函数
- More Effective C++ 条款2 最好使用C++转型操作符
- C语言文件操作函数大全
- C语言控制用户输入的字符个数(curses.h代替conio.h)
- 程序编译是碰到的g++ 对c++11支持问题
- C语言标准
- C语言中,关键字static的作用
- c++ 输出虚函数表内容
- C语言:目标代码文件,可执行文件和库
- More Effective C++ 条款1 仔细区别pointers和references
- 自学笔记-C语言复习2015年6月25日
- C++编程思想学习笔记---第十章 名字控制