C++Primer第五版 第六章习题答案(41~50)

来源:互联网 发布:淘宝童装一件代理货源 编辑:程序博客网 时间:2024/05/17 09:22

41:知识点1:函数反复调用的过程中重复出现的形参,这样的值被称为默认实参。该参数在使用过程中可以被用户指定,也可以使用默认数值

知识点2:调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。

知识点3:一旦某个形参被赋予了默认值,其后所有形参都必须有默认值。

知识点4:顺序很重要!在设计函数时,将默认值的形参放在后面。

知识点5:在给定的作用域中,一个形参只能被赋予一次默认实参,且局部变量不能作为默认实参。


(a):ht需要提供实参

(b):合法

(c):合法,但是wd会被赋予*号


42:知识点1:返回的值用于初始化调用点的一个临时量,该临时量就是函数的调用结果——值是如何被返回的?

此题考查默认实参的应用

#include <iostream>#include<string>#include<vector>using namespace std;string make_plural(size_t ctr, const string& word, const string& ending = "s")//此处觉得题目描述有误,应该是第三个形参赋予"s",应为是字符串。{//size_t表示的是unsigned intreturn (ctr > 1) ? word+ending : word;}int main(int argc, char *argv[]){cout<<"两单词的单数形式:"<<make_plural(1,"success","es")<<"  "<<make_plural(1,"failure")<<endl;cout<<"两单词的复数形式:"<<make_plural(2,"success","es")<<"  "<<make_plural(2,"failure")<<endl;return 0;//代表执行成功}

43:知识点1:将函数指定为“内联函数(inline)”,将它在每个调用点上“内联的展开”,该说明只是向编译器发出一个请求,编译器可以选择忽略这个请求。内联的机制用于优化规模较小、流程直接、频繁调用的函数,建议不大于75行。

知识点2:constexpr函数是指能用于常量表达式的函数:函数的返回值类型和所有形参的类型必须是“字面值类型”:算术、引用、指针。并且函数体内有且只有一条return语句。

知识点3:将较小的操作如比较两个字符串的大小定义为函数,有很多的优点。

知识点4:inline函数和constexpr函数可以在函数中多次定义,但是通常将其定义在头文件中。


(a):放在头文件中,为inline函数

(b):放在头文件中,即使是普通函数,放在头文件中也是较好的


44:直接在函数的返回类型之前加上inline即可。


45:具体是否应被定义为内联函数,参照知识点1中的标准。


46:参照知识点2关于constexpr的定义,可以。直接在函数的返回类型之前加上constexpr


47:程序的调试帮助:assert和NDEBUG

知识点1:预处理宏assert(expr):包含一个表达式,expr为真时,assert什么也不做,为假时输出信息并终止程序。包含在cassert头文件中。通常用于检查不能发生的条件

知识点2:assert依赖于一个NDEBUG的预处理变量的状态,如果定义了NDEBUG,assert什么也不做,默认状态下NDEBUG是未定义的。编译器也可以预先定义该变量。

知识点3:也可以使用NDEBUG编写自己的条件调试代码,如果NDEBUG未定义,将执行#ifndef到#endif之间的代码,如果定义了NDEBUG,这些代码将被忽略。

void pp(){    #ifndef NDEBUGcerr<<"my name is:"<<__func__<<endl;    #endif//其他代码}

一些C++编译器定义的调试有用的名字:

_ _func_ _ :一个静态数组,存放函数的名字

_ _FILE_ _ :存放文件名的字符串字面值

_ _LINE_ _ :存放当前行号的整形字面值

_ _TIME_ _ :存放文件编译时间的字符串字面值

_ _DATE_ _ :存放文件编译日期的字符串字面值


#include <iostream>#include<string>#include<vector>using namespace std;void printVec(vector<int>& vec){#ifndef NDEBUGcout << "vector size: " << vec.size() << endl;#endifif (!vec.empty()) {auto tmp = vec.back();vec.pop_back();printVec(vec);cout << tmp << " ";}}int main(int argc, char** argv){vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};//c++11特性printVec(vec);cout << endl;return 0;}


48:不合理,只要有输入,则assert一直为真,无意义。最好用于检查不能发生的条件

assert(s = sought);


49:知识点1:候选函数:函数匹配的第一步是选定本次调用的重载函数集,集合中的函数被称为候选函数

知识点2:根据实参情况,从候选函数中挑选出能被这实参调用的函数,此次选出的函数被称为可行函数。

函数匹配:重载函数调用时的选择。


50:根据实参匹配情况

(a):不合法,42为int

(b):合法

(c):合法

(d):合法

0 0
原创粉丝点击