Loading

MoreEffect[5] 谨慎定义类型转换函数

C++编辑器允许两种类型之间的隐式转换,继承了C的类型转换方法,因此可以将short类型值传入接收int类型值的函数并正确编译允许。隐式转换可以方便运算和函数调用,但错误的转换可能导致数据丢失,如int类型转为short类型,而且这样的隐式转换错误很难发现。

隐式类型转换也支持类,通过类的单参数构造函数和隐式类型转换运算符。我们可以选择是否提供这些函数来控制类的隐式转换。

单参数构造函数

指只有一个参数或第一个之后的参数都有默认值的构造函数。

class Awesome
{
public:
    Awesome(int arg1, int arg2=1, int arg3=2)
    {
        cout << "init" << endl;
    }
};

void Function(Awesome obj)
{
    obj;
}

int main(void)
{
    Awesome obj = 10;//int到Awesome
    Function(10);
    return 0;
}

使用explicit关键字声明单参数构造函数,编译器禁止隐式类型转换调用该构造函数。

class Awesome
{
public:
    explicit Awesome(int arg1, int arg2=1, int arg3=2)
    {
        cout << "init" << endl;
    }
};

void Function(Awesome obj)
{
    obj;
}

int main(void)
{
    Function(10);//error: conversion from 'int' to non-scalar type 'Awesome' requested
    return 0;
}

隐式类型转换运算符

隐式类型转换运算符即C风格类型转换运算符,重载格式为:operator [类型符号]();:类型符号即转换之后返回的数据类型。

class Awesome
{
public:
    operator int()
    {
        return 10;
    }
};

void Function(int arg)
{
    arg;
}

int main(void)
{
    Awesome obj;
    int val = obj;
    val = 1 + obj;//obj转到int,再做加法
    cout << obj << endl;//obj转到int 打印整型
    Function(obj);

    return 0;
}

如果要避免上述的隐式类型转换,又需要能够将对象转为其它类型的值,应该用返回该类型值的函数代替。

class Awesome
{
public:
    int toInt(void) const
    {
        cout << "return" << endl;
        return 10;
    }
};
int main(void)
{
    Awesome obj;
    int val = obj;//error: cannot convert 'Awesome' to 'int' in initialization
    return 0;
}

显式转换函数返回的方式不如类型转换符方便,但可以避免隐藏的类型转换。

posted @ 2021-08-08 23:14  sandersunkown  阅读(77)  评论(0)    收藏  举报