c++中的类型转换以及explicit关键字

写在前面

在没有深入接触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 第六版》

猜你喜欢

转载自blog.csdn.net/li1615882553/article/details/85108983