(本文参考自《More Effecitve C++》 Item5 谨慎定义类型转换函数)
自定义类型转换函数有2种: 1.隐式类型转换运算符; 2.单参数构造函数。
隐式类型转换运算符是一个成员函数:operator其后跟一个类型和符号;不用定义函数的返回类型,因为返回类型就是这个函数的名字。
单参数构造函数是指只用一个参数即可以调用的构造函数。该函数可以是只定义了一个参数,也可以是虽定义了多个参数但第一个参数以后的所有参数都有缺省值。
类型转换函数为程序提供了便利,但是如果控制不好,会调入陷阱;当你在不需要使用转换函数时,这些转换函数却会被调用运行;这些不正确的程序调用会做出一些意想不到的事情,而又很难判断出原因。
自定义类型转换函数有2种: 1.隐式类型转换运算符; 2.单参数构造函数。
隐式类型转换运算符是一个成员函数:operator其后跟一个类型和符号;不用定义函数的返回类型,因为返回类型就是这个函数的名字。
单参数构造函数是指只用一个参数即可以调用的构造函数。该函数可以是只定义了一个参数,也可以是虽定义了多个参数但第一个参数以后的所有参数都有缺省值。
类型转换函数为程序提供了便利,但是如果控制不好,会调入陷阱;当你在不需要使用转换函数时,这些转换函数却会被调用运行;这些不正确的程序调用会做出一些意想不到的事情,而又很难判断出原因。
下面示例分析下类型转换函数的陷阱:
1. 隐式类型转换运算符
下面代码中cout<<r<<endl;
本意输出Rational的r,由于Rational没有重载"<<",r将隐式调用 operator double()转换为double类型,违背了输出为Rational类型的本意。
解决办法为使用函数显示转换。
详见代码注释:
#include <iostream>
using namespace std;
class Rational
{
public:
Rational(int numerator = 0, int denominator = 1){}
//隐式类型转换运算符,转换为double
operator double() const{}
//函数显示转换为double
dou