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。
阅读全文
0 0
- c类型自动转换
- C语言类型自动转换
- c语言 自动类型转换
- C语言自动类型转换
- c/c++自动类型转换
- C语言自动类型转换
- c语言的自动类型转换
- c语言的自动类型转换
- c语言的自动类型转换
- C常见问题之自动类型转换
- c语言的自动类型转换
- c语言的自动类型转换
- c语言的自动类型转换
- Objective-C KVC 自动转换类型研究
- C语言的自动类型转换
- C/C++的自动类型转换
- c 类型自动转换 出现问题
- c语言的自动类型转换
- 几个Proteus的仿真网站
- Ajax框架之DWR学习(简单入门案例)-yellowcong
- tomcat服务HTTPS双向认证
- iPhont X适配
- Spark集群搭建
- C++自动类型转换
- 指针数组
- Quartz封装
- 是什么让程序员成了一份苦逼的工作?
- 覆盖默认样式(React组件)
- [jzoj]3172. 【GDOI2013模拟4】贴瓷砖(AC自动机+卡时卡空)
- JAVA的 循环 随机数 函数
- Qt中的字符串类QString
- 分分钟上手C#的委托和事件