C++自动类型转换

来源:互联网 发布:牛牛开挂软件 编辑:程序博客网 时间:2024/06/05 01:14

C++中,如果编译器看到一个表达式或函数调用使用了一个不合适的类型,它会执行一个自动类型转换,将不合适的类型转换为合适的类型。对于自定义类,可以通过定义该类的构造函数的方法将其它类型转换为本自定义类;或者使用运算符将本自定义类转换为其它类型。

1 定义构造函数将其它类型转换为本类型

对于一个自定义类,可以为该类定义一个有一个参数的构造函数。则编译器可以将这个函数对应的类型转换为该自定义类类型。

1.1自动转换例子

首先,定义一个名为MyClass的类,该类包含一个有一个参数的构造函数。

class MyClass{public:int i;public:MyClass(int ii){i = ii;}};

接下来定义一个名为MyFunc()的函数,该函数的参数是自定义MyClass类的对象。

int MyFunc(MyClass myclass){return myclass.i;}
函数的返回值是MyClass类对象的成员变量i

最后,在main()函数中,执行如下代码

int result = MyFunc(1);
整型变量result的值是1。因为MyFunc()函数的参数是MyClass类的对象,当MyFunc()函数的参数是int类型时,编译器检查是否可以从int类型转换为MyClass类型,结果发现可以通过MyClass的构造函数MyClass(int ii)这种方式实现转换。所以,在以上代码中,MyClass::MyClass(int ii)函数首先被调用,编译器将int类型转换为MyClass类型之后,再调用MyFunc(MyClass myclass)函数将MyClass类对象的成员变量i的值作为返回值返回。

1.2 禁止自动转换

如果需要禁止这种通过构造函数的自动转换,则需要使用explicit关键字对MyClass类的构造函数进行修饰。

class MyClass{public:int i;public:explicit MyClass(int ii){i = ii;}};

此时,在main()函数中,如下代码

int result = MyFunc(1);
在编译时就会报错,其报错信息为error C2664:int MyFunc(MyClass):无法将参数 1从“int”转换为“MyClass””。此时就无法再通过构造函数实现类型的自动转换了。

此时,只需将调用MyFunc()函数的代码改为如下即可

int result = MyFunc(MyClass(1));

2 使用运算符将本自定义类转换为其它类型

仍以1定义构造函数将其它类型转换为本类型”中提到的MyClass类为例,可以为该类定义一个运算符,通过该运算符,将该类型的对象转换为其它类型。

class MyClass{public:int i;public:explicit MyClass(int ii){i = ii;}operator int() { return i; }//运算符重载};
通过operator关键字重载了运算符,但是该运算符重载的方式比较特别,因为没有指定一个返回类型。其实,使用本方法重载的运算符返回类型就是运算符的名字。在MyClass类中重载的运算符的返回值是int,通过该重载的运算符,可以将MyClass类型转换为int类型。

接下来定义一个名为MyFunc2()的函数,该函数的参数是int类型。

int MyFunc2(int i){return i;}
main()函数中,有如下代码

int result2 = MyFunc2(MyClass(1));

此时,虽然MyFunc2()函数的形参类型是int,而实参类型是MyClass,但是由于为MyClass类重载了自动类型转换运算符,所以该代码能够正常运行,result2的值是1