写在前面
在没有深入接触c++之前,只是简单的知道变量存在自动转换和强制转换,比如,int a = 3.3;
同样也可以对类对象进行自动类型转换以及强制类型转换
类型转换
使用《c++ primer plus》中的例子:
/*
Stonewt.h文件
*/
#ifndef STONEWT_H_
#define STONEWT_H_
namespace STONE
{
class Stonewt
{
private:
enum { Lbs_to_stn = 14};
int stone;
double pds_left;
double pounds;
public:
Stonewt(double lbs);
Stonewt(int stn, double lbs = 0);
Stonewt();
~Stonewt();
void show_lbs() const;
void show_stn() const;
};
}
#endif
/*
Stonewt.cpp文件
*/
#include <iostream>
#include "Stonewt.h"
using std::cout;
namespace STONE
{
Stonewt::Stonewt(double lbs)
{
stone = (int)lbs / Lbs_to_stn;
pds_left = (int)lbs % Lbs_to_stn + lbs - (int)lbs;
pounds = lbs;
}
Stonewt::Stonewt(int stn, double lbs)
{
stone = stn;
pds_left = lbs;
pounds = stn * Lbs_to_stn + lbs;
}
Stonewt::Stonewt()
{
stone = pounds = pds_left = 0;
}
Stonewt::~Stonewt()
{
}
void Stonewt::show_stn()const
{
cout << stone << " stone, " << pds_left << "pounds\n";
}
void Stonewt::show_lbs()const
{
cout << pounds << " pounds\n";
}
}
在c++中,接受一个参数的构造函数可以将类型与该参数相同的值转换为类:Stonewt (double lbs)
可以这样:
Stonewt mycat;
mycat = 19.6;
程序使用构造函数创建一个临时Stonewt对象,并使用19.6对他进行初始化,随后将内容复制到mycat中,不需要进行强制类型转换
只接受一个参数的构造函数可以用来类型转换,接受两个参数构造函数,当第二个参数有默认值时也可以用来进行类型转换,如:
Stonewt(int stn, double lbs = 0);
当要关闭这种隐式转换,可以使用explicit关键字,但是如果增加explicit关键字,显示转换还是可以进行的
Stonewt mycat;
mycat = (Stonewt) 19.6;
mycat = Stonewt(19.6);
测试程序:(未添加explicit)
#include <iostream>
#include "Stonewt.h"
using std::cout;
using STONE::Stonewt;
void display(const Stonewt &st, int n);
int main()
{
Stonewt mycat;
Stonewt wolft(158.5);
mycat = 19.6;
mycat.show_stn();
display(wolft, 1);
display(275, 1);
system("pause");
}
void display(const Stonewt &st, int n)
{
for (int i = 0; i < n; i++)
{
cout << "Wow! ";
st.show_stn();
}
}
当添加explicit关键字后,会出现下面错误
扫描二维码关注公众号,回复:
4727700 查看本文章
转换函数
数字可以转换为Stonewt对象,那么Stibewt对象也可以转换为数字,要实现这种方法,必须提供对应的转换函数
operator typename() //typename为要转换成的类型
注意:转换函数必须为类方法,转换函数不能指定返回类型,转化函数不能有参数
那么,要转换为double类型的函数原型为:operator double()
operator double() const; //Stonewt.h文件中加入
Stonewt::operator double() const //Stonewt.cpp文件中加入
{
return pounds;
}
//测试程序
Stonewt wolft(158.5);
double num = wolft;
cout << "num: " << num << "\n";
可以看到Stonewt对象已经转换成了double类型
参考书籍
《c++ primer plus 第六版》