高质量程序设计指南c++/c语言(9)--类型转换函数
class Point { public: Point(float x); private: float m_x; };
Point p1 = 10.5; //直接调用 Point::Point(float x)
p1 = 20.5; //先调用Point::Point(float x)把20.5转换成一个Point临时对象,然后再调用默认的operator=赋值函数。
又是通过构造函数进行的隐含类型转换可能会损害程序的可理解性,如下面:
class MyString { public: MyString(int n, char c='\0'); private: char *m_data; };
本意是构造一个长度为n的字符串,并用c来初始化。
MyString strName = 20;
strName = 40; //虽然正确,但是却莫名其妙
尤其是当定义这样函数的时候 void fun(MyString mstring);
f(100);编译器会偷偷摸摸的转换为 fun(MyString(100));
当你的类中出现类似的情况时,可以在构造函数前面加上关键字explicit将其声明为显示的,即要求用户必须显示的调用该构造函数来初始化对象。
当然也可以把类对象转换为其他类型的对象
class Point { public: Point(float x); operator float() const { return m_x; } private: float m_x; }
Point p(100.25);
cout <<p<<endl; //100.25,不用重载 << 运算符啦。
当为一个类提供了这两种类型转换函数时,可能引起二义性,所以谨慎使用。