}
// to count how many words' length are between 1-10
vector
36。修改前一段程序以报告在1到9之间以及10以上的单词的数目。 // 14.36_BT_cls_Words.cpp : 定义控制台应用程序的入口点。 //
#include \#include
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
37。使用标准库函数对象和函数适配器,定义一个对象用于: (a) 查找大于1024的所有值。
(b) 查找不等于pooh的所有字符串。 (c) 将所有值乘以2
(a) find_if( vec.begin(), vec.end(), bind2nd( greater
(b) find_if ( svec.begin(), svec.end(), bind2nd( not_equal_to
38。最后一个count_if调用中,用not1将bind2dn(less_equal
not1用于将一元函数对象的真值求反,not2用于将二元函数对象的真值求反,函数适配器bind2nd将less_equal
39。使用标准库函数对象代替GT_cls来查找指定长度的单词。
输入一个指定长度: vector
// … // input words into text string::size_type len; cin >> len; string *w;
for ( vector
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个都为候选函数,和可行函数,但是这个是最佳可行函数。