我是靠谱客的博主 专一小天鹅,最近开发中收集的这篇文章主要介绍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 使用运算符将本自定义类转换为其它类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部