C++学习笔记:类的自动转换和强制类型转换

本文详细介绍了C++中的类型转换,包括内置类型转换、构造函数转换和转换函数。当标准类型间进行兼容转换时,C++会自动进行转换。对于不兼容类型,如指针与整数,需要使用强制类型转换。同时,通过`explicit`关键字,可以控制构造函数只允许显式转换,避免不必要的隐式转换。转换函数则是将类对象转换为其他标准类型的手段,没有返回类型且无参数。过多的转换可能导致二义性,因此需谨慎使用。
摘要由CSDN通过智能技术生成

将一个标准类型变量的值赋给另一种标准类型时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型,这种称为C++的内置类型转换。例如:

long count = 8;
double time = 11;
int side = 3.33;

C++不自动转换不兼容的类型,例如:

int *p = 10;//类型不兼容,不可转换

因为左边是指针类型,右边是数字,是两个不同的概念,但可以使用强制类型转换完成。

int *p = (int *)10;//有效地表达式

将类定义成与基本类型或另一个类相关,使得从一种类型转换为另一种类型是有意义的。C++可以通过自动转换,或强制类型转换来完成。

以下是类Apple的构造函数声明。

Class Apple
{

    public:
    .......
    Apple();
    Apple(double m);
    .......
};

对于Apple类则可以实现以下转换:

Apple myApple;
myApple = 18.3;

        程序先使用构造函数Apple(double m)创建一个临时对象,将18.3作为初始值,随后,采用逐成员赋值方式将临时对象的内容复制到myApple中,这一过程称为隐式转换,它是自动进行的,不需要显示强制类型转换。只有接受一个参数的构造函数才能作为转换函数。 

        但是这种自动特性并非总是合乎需要的,这样容易导致意外的类型转换,因此,在C++中,可以使用关键字explicit关闭自动转换这种特性。即可以将构造函数声明为如下形式:

explicit Apple(double m);

这种形式就关闭了隐式转换,但仍然允许显示转换。一旦使用关键字explicit限定了构造函数,则只能用于显示转换。即上示转换只能用以下显示方式进行:

Apple myApple;
myApple = Apple(18.3);
或
myApple = (Apple)18.3;

转换函数

        在前面通过定义构造函数,能将数字转换为对象,那么,通过转换函数,也能将对象转换为数字。转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用他们。例如:

Apple myApple(23.5);
double it = double(myApple);
double its = (double)myApple;

以上形式中,编译器将查看是否定义了相应的转换函数,否则,将会生成错误消息。

        要转换 typeName 类型,需要的转换函数形式如下:

operator typeName();

typeName指出要转换成的类型,因此,不需要指出返回类型。转换函数是类方法,需要通过类对象来调用。 

注意:

  • 转换函数必须是类方法;
  • 转换函数不能指定返回类型;
  • 转换函数不能有参数。 

转换为double类型的函数原型如下:

operator double();

转换成int类型的函数原型如下:

operator int();

总结 

        C++为类提供以下类型转换:

  • 只有一个参数的类构造函数用户将类型与该参数相同的值转换为类类型。例如,将double值赋给类对象时,接受double参数的构造函数将自动被调用。但是,在构造函数中用explicit可防止隐式转换,只允许显示转换。
  • 被称为转换函数的特殊类成员运算符函数,将用于将类对象转换为其他类型。转换函数是类成员,没有返回类型,没有参数。将类对象赋给其他标准类型或强制转换为其他标准类型时,该转换函数将自动被调用。
  • 过多的转换函数将导致二义性,因此,转换函数在需要的时候才定义。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龋龋独行的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值