高质量程序设计指南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,不用重载 << 运算符啦。

当为一个类提供了这两种类型转换函数时,可能引起二义性,所以谨慎使用。

 

posted on 2013-04-26 22:12  江在路上2  阅读(160)  评论(0编辑  收藏  举报