本文共 1488 字,大约阅读时间需要 4 分钟。
先说下随机数rand()
C++ 类的转换, 是指基本类型转换成类类型
构造函数添加对相应数据类型的参数 然后生成一个对象。
比如 class A
aa.hclass 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
这部分我是大概这么理解 有点绕 等以后再慢慢深入理解吧
第十一章完结
转载地址:http://bnepi.baihongyu.com/