练习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
略