第十四章 14.9.1节练习

练习14.45

编写类型转换运算符讲一个Sales_data对象分别转换成string和double,你认为这些运算符返回值应公司是什么?

解答:

class Sales_data {
friend std::ostream &operator<<
                         (std::ostream&, const Sales_data&);
friend std::istream &operator>>(std::istream&, Sales_data&);
friend bool operator==(const Sales_data &, const Sales_data &);

friend std::ostream &print(std::ostream&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);

public:
	// constructors
	Sales_data() = default;
	Sales_data(const std::string &s): bookNo(s) { }
	Sales_data(const std::string &s, unsigned n, double p):
	           bookNo(s), units_sold(n), revenue(p*n) { }
	Sales_data(std::istream &);

	std::string isbn() const { return bookNo; }
	Sales_data& operator+=(const Sales_data&);
private:
	double avg_price() const;  
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

这里我们需要参考Sales_data的类型定义。

类型转换符(函数)应该返回对应的成员变量。

所以,转换成string应该返回bookNo,转换成double应该返回revenue。

Sales_data::operator string() const{
   return isbn();
}

Sales_data::operator double() const{
  return revenue;
}

练习14.46

你认为应该为Sales_data类定义上面两种类型转换符吗?应该把它们声明成explicit的吗?为什么?

解答:

个人认为应该声明成显示的,这样可以避免异常情况的出现。


练习14.47

说明下面这两个类型转换运算符的区别。

struct Integral{
  operator const int();
  operator int() const;
};

解答:

这两种方式实际使用起来应该没有区别的。

可以参考 http://bbs.youkuaiyun.com/topics/100030353 这里,讨论的内容类似。

(感谢 隔壁的程序员 同学勘误,以下是他的评论)

第一个type是const int 类型,此函数返回就是const int类型的,const 是修饰返回类型。
第二个type是int类型, 此函数返回就是int 类型的,const 是值不能在内部修改值,this指针指的对象的const。 
operator int ( ) { a = 10; return a; }
operator const int ( ) { a = 10; return a; } //error:a不能修改
但是
const int a;和 int const a;的确没区别 。


练习14.48


练习14.49



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值