ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:106.71KB ,
资源ID:7262264      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7262264.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++Primer第4版习题解答十四章.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++Primer第4版习题解答十四章.docx

1、C+Primer第4版习题解答十四章第十四章 重载操作符与转换1。在什么情况下重载操作符与内置操作符不同?在什么情况下重载操作符与内置操作符相同?重载操作符必须具有至少一个类类型或枚举类型的操作数。重载操作符不保证操作数的求值顺序,例如对 & 和 | 的重载版本不再具有“短路求值”的特性,两个操作数都要进行求值,而且不规定操作数的求值顺序。对于优先级和结合性及操作数的数目都不变。2。为Sales_item编写输入、输出。加以及复合赋值操作符的重载声明。class Sales_item friend std:istream& operator ( std:istream&, Sales_item

2、& ); 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

3、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、三句将不能被编译。4。string和vector类都定义了一个重载的=,可用于比较这些类的对象,指出下面的表达式中应用了哪个=版本。string s; vector svec1, svec2;“cobble” = “store” 应用了C+语言内置版本的重载=svec10 = svec20; 应用了string版本的重载=svec1 = svec2 应用了vector版本的重载=5。列出必须定义为类成员的操作符。赋值 = , 下标 , 调用 () ,成员访问箭头 - 6。解释下面操作符是否应该为类成员,为什么?(a)+ (b) += (c)+ (d) - (e) (f) & (g) = (h)

5、 ( )+, 和()必须定义为成员,否则会出现编译错误;+= 和 + 会改变对象的状态,通常会定义为类成员。7。为下面的ChecoutRecord类定义一个输出操作符:class CheckoutRecordpublic:/ .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 t s

6、.title t s.date_borrowed t s.date_due t ; out borrower: s.borrower.first , s.borrower.second endl; out wait_list: endl; for ( vector pair* :const_iterator it = s.wait_list.begin(); it != s.wait_list.end(); +it ) out t first , second endl; return out;8。在12.4节的习题中,你编写了下面某个类的框架: (b) Date为所选择的类编写输出操作符。#

7、includeusing namespace std;class Datepublic: 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 year: d.year t month: d.month t day: d.day endl;int mai

8、n() Date dt(1988, 12, 01); cout dt ( 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

9、.1节习题中定义的CheckoutRecord类定义一个输入操作符,确保该类操作符处理输入错误。class CheckoutRecordpublic: / friend istream& operator( istream&, CheckoutRecord& ); / 声明为类的友元/ ;istream & operator ( istream& in, CheckoutRecord& c ) cout c.book_id c.title; / Input Data data_borrowed and data_due cout c.date_borrowed; /.year c.date_b

10、orrowed.month c.date_borrowed.day; / Input Data data_due and data_due cout c.date_due;/.year c.date_due.month c.date_due.day; / Input the pair borrower cout Input the pair borrower (string) :n; in c.borrower.first c.borrower.second; if ( !in ) c = CheckoutRecord(); return in; / Input wait_list cout

11、Input the wait_list (string) :n; 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;输入错误的情况:输入正确的情况:12。编写Sales_item操作符,用+进行实际加法,而+=调用+。与本节中操作符的实现方法相比较,讨论这个方法的缺点。Sales_item Sales_item:operator+( co

12、nst Sales_item& rhs ) units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;将下面定义的非成员+=操作符声明为类Sales_item的友元:Sales_item operator+=( Sales_item& lhs, const Sales_item& rhs ) lhs = lhs + rhs; return lhs;这个方法缺点:在+=操作中需要创建和撤销一个临时Sales_item对象,来保存+操作的结果,没有本节中的方法简单有效。13。如果有,你认为Sales_item还应该有哪些其

13、他的算术操作符?定义你认为的该类应包含的那些。还应有-操作符,定义为类的非成员,相应地还应该有 -= 复合操作符并定义为类的成员。Sales_item& Sales_item:operator-=( const Salse_item& rhs ) units_sold -= rhs.units_sold; revenue -= rhs.revenue; return *this;Sales_item operator-( const Sales_item &lhs, const Sales_item & rhs ) Sales_item ret(lhs); ret -= rhs; return

14、 ret;14。定义一个赋值操作符,将isbn赋值给Sales_item对象。Sales_item& Sales_item:operator=( const string & s ) sbn = s; return *this;10。为14.2.1节习题中介绍的CheckoutRecord类定义赋值操作符。主函数中定义了两个 CheckoutRecord 类的对象,调用了CheckoutRecord 类的 =赋值操作符,效果如下截图:int _tmain(int argc, _TCHAR* argv) CheckoutRecord c1; cin c1; CheckoutRecord c2;

15、c2 = c1; / 调用了类的赋值操作符= std:cout c2 std:endl; / 输出对象c2的内容 system(pause); return 0;/ CheckoutRecord类中赋值操作符定义为:/ 重载操作符=CheckoutRecord& CheckoutRecord:operator =( const CheckoutRecord& cr ) book_id = cr.book_id; title = cr.title; date_borrowed = cr.date_borrowed; / 前提:必须在Date类里也重载操作符= date_due = cr.date

16、_due; / as before / 对pair进行赋值操作 borrower.first = cr.borrower.first; borrower.second = cr.borrower.second; / 对vector进行赋值操作 wait_list.clear(); / 首先清空 for ( vector pair* :const_iterator it = cr.wait_list.begin(); it != cr.wait_list.end(); + it ) pair *ppr = new pair; ppr-first = (*it)-first; ppr-second

17、 = (*it)-second; wait_list.push_back( ppr ); return *this;16。CheckoutRecord类还应该定义其他赋值操作符吗?如果是,解释哪些类型应该用作操作数并解释为什么。为这些类型实现赋值操作符。从应用角度考虑,可能会修改预约时间date_due,可通过设置新的赋值操作符来实现;或者是往wait_list里添加排队读者,也可以通过设置新的赋值操作符来实现。/ set new date_dueCheckoutRecord& CheckoutRecord:operator=( const& new_due ) date_due = new_

18、due; return *this;/ add new readers who wait for some booksCheckoutRecord& CheckoutRecord:operator=( const std:pair& new_waiter ) pair *ppr = new pair; *ppr = new_waiter; wait_list.push_back( ppr ); return *this;17。14.2.1节习题中定义了一个CheckoutRecord类,为该类定义一个下标操作符,从等待列表中返回一个名字。下标重载:pair& CheckoutRecord:op

19、erator ( const vector pair* :size_type index ) return *wait_list.at( index ); / 下标操作符重载const pair& CheckoutRecord:operator ( const vector pair* :size_type index ) const return *wait_list.at( index );18。讨论用下标操作符实现这个操作的优缺点。优点:使用简单。缺点:操作的语义不够清楚,因为CheckoutRecord不是一个通常意义上的容器,而且等待者也不是CheckoutRecord容器中的一个元

20、素,不易使人弄明白怎样用。19。提出另一种方法定义这个操作。可以将这个操作定义成普通的函数, pair& get_a_waiter( const size_t index ) 和 const pair& get_a_waiter ( const size_t index ) const.20。在ScreenPtr类的概略定义中,声明但没有定义赋值操作符,请实现ScreenPtr赋值操作符。ScreenPtr& operator=( const ScreenPtr& sp ) +sp.ptr-use; if ( -ptr-use = 0 ) delete ptr; ptr = sp.ptr; r

21、eturn *this;21。定义一个类,该类保存一个指向ScreenPtr的指针。为该类定义一个重载的箭头操作符。class NoNamepublic: NoName( *p ): ps( new ScreenPtr(p) ) ScreenPtr operator-( ) return *ps; const ScreenPtr operator-( ) const return *ps; NoName() delete ps; private: ScreenPtr *ps;22。智能指针可能应该定义相等操作符和不等操作符,以便测试两个指针是否相等或不等。将这些操作加入到ScreenPtr类。

22、class ScreenPtrpublic: / friend inline bool operator=( const ScreenPtr &, const ScreenPtr &); friend inline bool operator!=( const ScreenPtr &, const ScreenPtr &);private: ScrPtr *ptr;/ operator =inline bool operator=( const ScreenPtr &p1, const ScreenPtr &p2 ) return p1.ptr = p2.ptr; / operator !=i

23、nline bool operator!=( const ScreenPtr &p1, const ScreenPtr &p2 ) return !( p1.ptr = p2-.ptr );23。CheckedPtr 类表示指向数组的指针。为该类重载下标操作符和解引用操作符。使操作符确保CheckedPtr有效:它应该不可能对超出数组末端的元素进行解引用或索引。/ 下标操作符重载int& CheckedPtr:operator( const size_t index ) if ( beg + index = end ) throw out_ot_range( “ invalid index“

24、); return *( beg + index );const int & CheckedPtr:operator ( const size_t index ) const if ( beg + index = end ) throw out_ot_range( “ invalid index“ ); return *( beg + index );/ 解引用操作符重载int CheckedPtr:operator*() if ( curr = end ) throw out_of_range( “ invalid current pointer” ); return *curr;const

25、 int& CheckedPtr:operator*() const if ( curr = end ) throw out_of_range(“ invalid current pointer”); return *curr;24。习题14.23中定义的解引用操作符或下标操作符,是否也应该检查对数组起点之前的元素进行的解引用或索引?解释你的答案。对于下标操作符,应该进行检查,因为当用户给出的下标索引值小于0时,编译器不会出现编译错误,而会出现运行时错误。应修改为:/ 下标操作符重载int& CheckedPtr:operator( const size_t index ) if ( beg + index = end | beg + index = end | beg + index beg ) throw out_ot_range( “ invalid index“ ); return *( beg + index );而对于解引用操作符,返回curr所指向的数组元素,在创建对象时已经将curr初始化为指向数组的第一个元素,只有当执行操作时才会对curr进行减的操作,而操作符已经对curr的值与数组起点进行了检查,所以不用再在这里检查。25。为了

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1