C++Primer 第14章-重载操作符与转换-课后习题答案

2019-03-16 18:02

第十四章 重载操作符与转换

1。在什么情况下重载操作符与内置操作符不同?在什么情况下重载操作符与内置操作符相同?

重载操作符必须具有至少一个类类型或枚举类型的操作数。重载操作符不保证操作数的求值顺序,例如对 && 和 || 的重载版本不再具有“短路求值”的特性,两个操作数都要进行求值,而且不规定操作数的求值顺序。

对于优先级和结合性及操作数的数目都不变。

2。为Sales_item编写输入、输出。加以及复合赋值操作符的重载声明。 class Sales_item { friend std::istream& operator >> ( std::istream&, Sales_item& ); friend std::ostream& operator <<(std::ostream&, const Sales_item&); public: Sales_item& operator += ( const Sales_item& ); };

Sales_item operator+ ( const Sales_item&, const Sales_item& )

3。解释如下程序,假定Sales_item构造函数的参数是一个string,且不为explicit.解释如果构造函数为explicit会怎样。

string null_book = “0-000-00000-0”; Sales_item item(cin); item += null_book;

第一句:调用接受一个C风格的字符串形参的string构造函数,创建一个string临时对象,然后使用string复制构造函数用这个临时对象初始化string对象null_book, 第二句:从标准输入设备读入数据,创建Sales_item对象item。

第三句:首先调用接受一个string参数的Sales_item构造函数,创建一个临时对象,然后调用Sales_item的复合重载操作符+=,将这个Sales_item临时对象加到item对象上,

如果构造函数为explicit,则不能进行从string对象到Sales_item对象的隐式转换,第三句将不能被编译。

4。string和vector类都定义了一个重载的==,可用于比较这些类的对象,指出下面的表达式中应用了哪个==版本。

string s; vector svec1, svec2;

“cobble” == “store” 应用了C++语言内置版本的重载== svec1[0] == svec2[0]; 应用了string版本的重载== svec1 == svec2 应用了vector版本的重载==

5。列出必须定义为类成员的操作符。

赋值 = , 下标[] , 调用 () ,成员访问箭头 ->

6。解释下面操作符是否应该为类成员,为什么?

(a)+ (b) += (c)++ (d) -> (e) << (f) && (g) == (h) ( )

+, <<, ==,&& 通常定义为非成员;->和()必须定义为成员,否则会出现编译错误;+= 和 ++ 会改变对象的状态,通常会定义为类成员。

7。为下面的ChecoutRecord类定义一个输出操作符: class CheckoutRecord {

public: // .. private: double book_id; string title; Date date_borrowed; Date date_due; pair borrower; vector< pair* > wait_list; };

ostream&

operator << (ostream& out, const CheckoutRecord& s) { out << s.book_id << \ << s.title<< \ << s.date_borrowed<< \ << s.date_due << \ ; out<< \ <* >::const_iterator it = s.wait_list.begin(); it != s.wait_list.end(); ++it ) { out << \ << (*it)->first << \ << (*it)->second << endl; } return out; }

8。在12.4节的习题中,你编写了下面某个类的框架: (b) Date 为所选择的类编写输出操作符。 #include using namespace std;

class Date {

public: Date() {} Date( int y, int m, int d ) { year = y; month = m; day = d; } friend ostream& operator<< ( ostream&, const Date& ); private: int year, month, day; };

ostream&

operator<< ( ostream& out, const Date& d ) { out << \ << \ << \}

int main() {

Date dt(1988, 12, 01); cout << dt << endl; system(\ return 0; }

9。给定下述输入,描述Sales_item输入操作符的行为。 (a) 0-201-99999-9 10 24.95 (b) 10 24.95 0-201-99999-9

(a) 将 0-201-99999-9 读入赋给对象的isbn成员,将10给units_sold成员,revenue成员被设置为249.5

(b) 首先将形参对象的isbn成员设置为10, 然后因为输入的数据不符合要求,导致输入失败,从而执行else语句,将Sales_item对象复位为空对象,此时isbn为空string,units_sold和revenue都为0

10。下述Sales_item输入操作符有什么错误? istream& operator>>( istream& in, Sales_item& s ) {

}

double price;

in >> s.isbn >> s.units_sold >> price; s.revenue = s.units_sold * price; return in;

如果将习题14.9中的数据作为输入,将会发生什么?

上述的输入操作符中 缺少了对错误输入情况的判断与处理,会导致错误的情况发生。 (a)的输入没有问题,但是(b)的输入,将形参Sales_item对象的ISBN成员值为10, units_sold和revenue成员保持原值不变。

11。为14.2.1节习题中定义的CheckoutRecord类定义一个输入操作符,确保该类操作符处理输入错误。

class CheckoutRecord {

public: // … friend istream& operator>>( istream&, CheckoutRecord& ); // 声明为类的友元 // … };

istream & operator>> ( istream& in, CheckoutRecord& c ) { cout << \; in >> c.book_id >> c.title; // Input Data data_borrowed and data_due cout << \; in >> c.date_borrowed; //.year >> c.date_borrowed.month >> c.date_borrowed.day; // Input Data data_due and data_due cout << \; in >> c.date_due;//.year >> c.date_due.month >> c.date_due.day; // Input the pair borrower cout << \; in >> c.borrower.first >> c.borrower.second; if ( !in ) { c = CheckoutRecord(); return in; } // Input wait_list cout << \; c.wait_list.clear(); while ( in )

}

{ pair *ppr = new pair; in >> ppr->first >> ppr->second; if ( !in ) { delete ppr; return in; } c.wait_list.push_back( ppr ); }

return in;

输入错误的情况:

输入正确的情况:


C++Primer 第14章-重载操作符与转换-课后习题答案.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2013北京大兴区高三数学(文)一模试题及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: