使用类(3)

转换构造函数和转换函数

//head.h

#pragma once

#ifndef _CLASS_H_
#define _CLASS_H_

class Stonewt
{
private:
	enum {Lbs_per_stn = 14}; // static Lbs_per_stnd = 14
	int stone;
	double pds_left;
	double pounds;
public:
	Stonewt(double lbs); // 是接受一个参数的构造函数 -- 转换构造函数
	Stonewt(int stn, double lbs);
	Stonewt();
	~Stonewt();
	void show_lbs()const;
	void show_stn()const;
	// 转换函数
	explicit operator int()const;   // 必须要显示使用该转换函数 -- 加上了explicit
	operator double()const;
};



#endif


// fuc.cpp

#include"head.h"
#include<iostream>
using std::cout;

Stonewt::Stonewt(double lbs)
{
	stone = int(lbs) / Lbs_per_stn;     //  强制类型转换: int (lbs) 和 (int) lbs 效果相同
	pds_left = (int)lbs % Lbs_per_stn;
	pounds = lbs;
}

Stonewt::Stonewt(int stn, double lbs)
{
	stone = stn;
	pds_left = lbs;
	pounds = stn * Lbs_per_stn + lbs;
}

Stonewt::Stonewt()
{
	stone = pounds = pds_left = 0;
}

Stonewt::~Stonewt()
{

}

void Stonewt::show_stn()const
{
	cout << stone << " stone, " << pds_left << " pounds" << std::endl;
}

void Stonewt::show_lbs()const
{
	cout << pounds << " pounds" << std::endl;
}

// 转换函数的定义

Stonewt::operator int()const
{
	return int(pounds + 0.5); //实现返回整数型的四舍五入
}

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


// main.cpp

//1.转换构造函数:本质上就是只接受一个参数的构造函数
// 原理:构造函数在进行构造时会创建一个类对象副本来赋值,最后返回这个副本
// 使用:Stonewt inconito = 275 -- 利用了单参数构造函数来进行初始化 相当于 Stonewt inconito = Stonewt(275) 和 Stonewt inconito(275)

//2.转换函数: 语法: operator typename() 
// 转换函数声明在类中,没有参数,也没有返回类型,但是在函数的定义中必须要有返回值,且这个返回值的类型与typename相同

//3. explicit可以可以关闭自动转换的特性,使得上述的两种转换函数必须要显示使用才可以发挥作用(explicit加在类的函数声明前即可)

#include"head.h"
#include<iostream>

int main()
{
	using std::cout;
	using std::endl;
	Stonewt pounds2(9, 2.8);
	Stonewt pounds1 = 15; //利用只有一个参数的构造函数来进行初始化 -- 即转换构造函数
	double p_wt = pounds2;  // 利用转换函数将类对象赋值给了double类型的变量
	cout << "pound1: " << endl;
	pounds1.show_lbs();
	pounds1.show_stn();
	pounds1 = 20; //利用转换构造函数
	cout << "After changing: " << endl;
	pounds1.show_lbs();
	pounds1.show_stn();
	cout << "pounds2(double):" << endl;
	cout << "p_wt = " << p_wt << endl;
	cout << "After convert to int:" << endl;
	cout << "p_wt = " << (int)p_wt << endl;

	long num = pounds2; 
	//若此处的int转换函数没有被设置为explicit, 则编译器会报错,因为int和double型的转换都可以将pounds2赋给num,会出现二义性
	//但若给int转换函数的类声明处加上了explicit,则必须显式调用该转换函数,所以此处会自动调用double转换函数
	


	system("pause");
	return 0;
}

//1.转换构造函数:本质上就是只接受一个参数的构造函数
// 原理:构造函数在进行构造时会创建一个类对象副本来赋值,最后返回这个副本
// 使用:Stonewt inconito = 275 -- 利用了单参数构造函数来进行初始化 相当于 Stonewt inconito = Stonewt(275) 和 Stonewt inconito(275)

//2.转换函数: 语法: operator typename()   -- 重载运算符: returntype operatorop()
// 转换函数声明在类中,没有参数,也没有返回类型,但是在函数的定义中必须要有返回值,且这个返回值的类型与typename相同

//3. explicit可以可以关闭自动转换的特性,使得上述的两种转换函数必须要显示使用才可以发挥作用  (explicit加在类的函数声明前即可)

//4.long num = pounds2; 
//若此处的int转换函数没有被设置为explicit, 则编译器会报错,因为int和double型的转换都可以将pounds2赋给num,会出现二义性
//但若给int转换函数的类声明处加上了explicit,则必须显式调用该转换函数,所以此处会自动调用double转换函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值