目录
前言
一 转换函数
总结
前言
接着上一章的内容
一 转换函数
接着我们上一章节的内容,我们知道我们类里面有一个自动转换利用=这个运算符,这样就可以使得对象可以接受这个值
那么有没有可以使一个普通类型去接收一个对象呢?
答案是有的,这就是转换函数,也叫C++运算符函数
我们通过代码来理解这个概念
头文件#ifndef __COOL_H__ #define __COOL_H__using namespace std; class Stonewt{private:static const int Lbs_per_stn = 14;int stone;double pds_left;double pounds;public:Stonewt(double lbs);Stonewt(int stn, double lbs);Stonewt();void show_lbs()const;void show_stn()const;operator int () const;operator double() const; };#endif
工具函数
#include<iostream> #include"cool.h" using namespace std;Stonewt::Stonewt(double lbs){stone = (int)lbs / Lbs_per_stn;pds_left = (int)lbs % Lbs_per_stn + lbs - (int)lbs;pounds = lbs; }Stonewt::Stonewt(int stn, double lbs){stone = stn;pds_left = lbs;pounds = stn * Lbs_per_stn + lbs; }Stonewt::Stonewt(){stone = pds_left = pounds = 0; }void Stonewt::show_lbs()const{cout << "stone = " << stone << "pds_left = " << pds_left << endl; }void Stonewt::show_stn()const{cout << "pounds = " << pounds << endl; }Stonewt::operator int() const{return (int)(pounds + 0.5); }Stonewt::operator double() const{return pounds; }
main函数
#include<iostream> #include"cool.h" using namespace std;int main(){Stonewt popo(9,2.8);double a = popo;cout << a << endl;return 0; }
首先我们要用一个double类型的a进行赋予对象的时候,这个时候如果你没有写转换函数的时候,这个时候是会报错的,所以我们还要加上转换函数
编译器会识别这里的左值是普通类型,右边为我们自定义类型,编译器会去寻找这个转换函数来进行转换,从而实现对象到普通类型的转换
书写的格式:operator typeName() ;
这里的operator表示操作也就是用到转换函数的
这个后面就是我们要转换的类型
请注意以下几点:
• 转换函数必须是类方法
• 转换函数不能指定返回类型
• 转换函数不能有参数
例如,转换为doub1e类型的函数的原型如下: operator double();
陷阱
当我们程序里面有两个强制转换的类型,这个时候不写显示转换的话就会导致编译器不知道转换到哪一种类型,但是当我们只有一个强制转换类型的函数的时候,就可以这么写
对于这个陷阱我们有两解决办法
1 在前面加上explicit,表示这个只可以用显示进行强制转换,不可以进行隐式的转换
2 可以写成成员函数
总结
学习了我们可以从对象转换到普通类型的方法:转换函数
这个转换函数要注意点就是我们书写多个的时候要注意会出现二义性错误
然后就是我们要巧妙使用explicit这个关键词和运用成员函数解决这个问题
书写格式是operator typename( )这个格式