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

2019-03-16 18:02

}

// to count how many words' length are between 1-10

vector::size_type cnt = count_if( text.begin(), text.end(), BT_cls( 1, 10 )); std::cout << \ << cnt << \ << std::endl; system(\); return 0;

36。修改前一段程序以报告在1到9之间以及10以上的单词的数目。 // 14.36_BT_cls_Words.cpp : 定义控制台应用程序的入口点。 //

#include \#include #include #include #include using namespace std;

class BT_cls {

public: BT_cls( size_t len1 = 0, size_t len2 = 0 ) : minlen( len1 ), maxlen( len2 ) { } bool operator() ( const string &s ) { return ( s.size() >= minlen && s.size() <= maxlen ); }

private: std::string::size_type minlen, maxlen; };

int _tmain(int argc, _TCHAR* argv[]) { std::cout << \ << std::endl; vector text; string word; while ( std::cin >> word ) { text.push_back( word ); } // end of input the text std::cin.clear(); // deal with text , to count how many words' length are between 1-9 size_t cnt = count_if( text.begin(), text.end(), BT_cls( 1, 9 )) ; std::cout << \<< cnt << \ << std::endl; cout << \ << text.size() - cnt << \ << endl; system(\); return 0; }

37。使用标准库函数对象和函数适配器,定义一个对象用于: (a) 查找大于1024的所有值。

(b) 查找不等于pooh的所有字符串。 (c) 将所有值乘以2

(a) find_if( vec.begin(), vec.end(), bind2nd( greater(), 1024 ) );

(b) find_if ( svec.begin(), svec.end(), bind2nd( not_equal_to(), “pooh”); (c) transform( ivec.begin(), ivec.end(), ivec.begin(), bind2nd( multiplies(), 2 ) );

38。最后一个count_if调用中,用not1将bind2dn(less_equal(), 10 ) 的结果求反。为什么使用not1而不用not2?

not1用于将一元函数对象的真值求反,not2用于将二元函数对象的真值求反,函数适配器bind2nd将less_equal对象的右操作数绑定到10,从而less_equal对象由二元函数对象转换为一元函数对象,所以用not1求反。

39。使用标准库函数对象代替GT_cls来查找指定长度的单词。

输入一个指定长度: vector text;

// … // input words into text string::size_type len; cin >> len; string *w;

for ( vector::iterator it = text.begin(); it != text.end(); ++it ) { w = find_if ( it, text.end(), bind2nd( equal_to(), len) ); }

cout << “ The words whose length is “<< len << ” was found.,It is:” << *w <

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

不是好办法,因为不必在需要stirng类型和double类型对象的地方使用Sales_item对象,这种做法没有太大用处。

41。解释这两个转换操作符之间的不同: class Integral {

public: operator const int(); operator int() const; };

不同:前者将对象转换为const int值,后者将对象转换为int值,前者太严格,限制使用在可以使用const int 值的地方,只保留后者,将变得更为通用。

42。为14.2.1节习题中的CheckoutRecord类定义到bool的转换操作符。 CheckoutRecord::operator bool() const {

return wair_list.empty(); } 43。解释bool转换操作符做了什么。这是这个CheckoutRecord类型转换唯一可能的含义吗?解释你是否认为这个转换是一种转换操作的良好使用。

将wait_list为空的CheckoutRecord对象转换为bool类型的true,将不为空的对象转换为false. 不是唯一的含义,还可以将bool转换符定义为当前日期是否已经超过date_due,即判断某本借出的书是否已经过期。

上述定义可用于判断是否有读者在等待借阅,当某本书被归还时,可以用相应的CheckoutRecord对象作为判断条件以确定是否通知该书的等待着。因此这个转换是一种转换操作的良好使用。

44。为下述每个初始化列出可能的类类型转换序列。每个初始化的结果是什么? class LongDouble {

public: operator double(); operator float(); };

LongDouble ldObj;

(a) int ex1 = ldObj; (b) float ex2 = ldObj;

(a) 既可以先使用从Longdouble到double 的转换操作,再是偶那个从double到int的标准转换,也可以使用从LongDouble到float的转换操作,再使用从float到int的标准转换,二者没有优劣之分,具有二义性。

(b) 使用从LongDouble到float的转换操作,将ldObj对象转换为float值用于初始化ex2

45。哪个calc()函数是如下函数调用的最佳可行函数?列出调用每个函数所需的转换序列,并解释为什么所选定的就是最佳可行函数。 class LongDouble {

public: LongDouble( double ); // … };

void calc( int );

void calc( LongDouble ); double dval;

calc( dval ); // which function?

最佳可行函数是void calc(int), 调用此函数的转换为:将实参double类型转换为int类型的,为标准转换;调用void calc( LongDouble)函数时,将实参从double转换为LongDouble类型,

为类类型转换,因为标准转换优于类类型转换,所以第一个函数为最佳可行函数。

46。对于main中的加操作,哪个operator是最佳可行函数?列出候选函数。可行函数以及对每个可行函数中实参的类型转换。 class Complex {

public: Complex( double ); // … };

class LongDouble { friend LongDouble operator+( LongDouble, int ); public: LongDouble( int ); operator double(); LongDouble operator+( const Complex & ); // … };

LongDouble operator+( const LongDouble &, double); LongDouble ld( 16.08 );

double res = ld + 15.05; // which operator+?

(a) 内置类型的+操作符 将ld从LongDouble转换为double类型。

(b) 友元 friend LongDouble operator+( LongDouble, int ); 将 15.05从double类型转换为int类型(使用标准转换)。 (c) LongDouble operator+( const Complex & );

将15.05转换为Complex型,使用Complex类的构造函数。 (d) 全局函数LongDouble operator+( const LongDouble &, double); 无需进行类型转换,因此虽然这4个都为候选函数,和可行函数,但是这个是最佳可行函数。


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

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

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

马上注册会员

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