C++ Primer Plus 学习笔记 第十一章 类的自动转换和强制类型转换 转换函数

先说下随机数rand()

C++ 类的转换, 是指基本类型转换成类类型

构造函数添加对相应数据类型的参数 然后生成一个对象。

比如 class A

aa.h

class A
{

private:
    doube aaa;
public:
    A(double x);
}

aa.cpp

#include "aa.h"

A::A(double x)
{
    aaa = x;
}

然后在操作时候就可以这样 A b = 3.3;

这样C++会对3.3进行自动转换

如果想想关掉这个自动转换,就加上 explicit声明

explicit A(double x);

但依然接收强制类型转换

A c = A(3.3);

最后一点有个前提,没有其他类型参数的构造函数跟double相符 嗯。。。意思就是 如果传入的参数是long a = 1 那正常double会将long转换成double,但是如果这时候有 A(int b)构造函数 那就会出现二义性。编译器会报错 因为 long可以转换成int 也可以转换成double 

转换函数:

上面说的是将基本类型转换成类类型

那如果碰到需要将类类型转换成基本类型呢?

这么干:

哇~ 这不是运算符重载么  666

示例:


Stonewt::operator int() const
{
  return int (pounds + 0.5);
}

Stonewt::operator double() const
{
  return pounds;
}

int main()
{
  using std::cout;
  Stonewt poppins(9, 2.8);
  double p_wt = poppins;
  cout << "Convert to double => ";
  cout << "Poppins: " << p_wt << " pounds.\n";
  cout << "Convert to int => ";
  cout << "Poppins: " << int(poppins) << " pounds.\n";
  return 0;
}

在这里 如果cout中不使用强制类型转换 将会出现二义性错误因为Stonewt可以转换成int型,也可以转换成double型 咋搞 报错好了

所以显示的强制类型转换 指明要转换的类型

这个也适用于前面的将类类型赋值给基本类型时候的情景。 

ing c = (int) A (随便举个例子 跟前面举例无关)

同样的 如果不希望编译器进行隐式的自动转换 就在operator 声明的前面加上 explicit 这样就不允许隐式转换了

或者还有一种方法:

int A::A_to_int() { return int (0.5);}

这样 使用 int b = A 就不行= = 这个。。。不就是不用Operator int()么= =

最后一个转换函数和友元函数的那个 。嗯。。。说的绕 不是很明白到底要表示啥

应该是 如果使用了A(double l)和 operator+(A &a) 或者相应的友元函数 friend A operator+ (A &a, A &b)  然后又设置了 operator double()(之类的)

那有可能在实际使用中出现二义性。 和转换不确定的情况。所以 建议 

第一种方法: 不要去设置operator double()  

第二种方法: operator+()和友元函数传入的参数显示的设置为double 

这部分我是大概这么理解 有点绕  等以后再慢慢深入理解吧  

第十一章完结

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@凌晨三点半

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

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

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

打赏作者

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

抵扣说明:

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

余额充值