我是靠谱客的博主 专一小天鹅,最近开发中收集的这篇文章主要介绍C++自动类型转换1 定义构造函数将其它类型转换为本类型2 使用运算符将本自定义类转换为其它类型,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
在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。
最后
以上就是专一小天鹅为你收集整理的C++自动类型转换1 定义构造函数将其它类型转换为本类型2 使用运算符将本自定义类转换为其它类型的全部内容,希望文章能够帮你解决C++自动类型转换1 定义构造函数将其它类型转换为本类型2 使用运算符将本自定义类转换为其它类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复