C++Primer(第五版 )第六章 函数 章节编程练习答案

6.2 请指出下列函数哪个有错误,为什么?应该如何修改这些错误呢?

答:

应该改为下面这样

6.3 编写你自己的fact函数,上机检查是否正确。注:阶乘。

答:

6.5 编写一个函数输出其实参的绝对值。

答:

6.6 说明形参、局部变量以及局部静态变量的区别。编写一个函数,同时达到这三种形式。

答:形参定义在函数形参列表里面;局部变量定义在代码块里面;

局部静态变量在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止时才被销毁

注意区别:

6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。

答:利用静态变量

6.8 编写一个名为Chapter6.h 的头文件,令其包含6.1节练习中的函数声明。

答:

6.9 编写你自己的fact.cc 和factMain.cc ,这两个文件都应该包含上一小节的练习中编写的 Chapter6.h 头文件。通过这些文件,理解你的编译器是如何支持分离式编译的。

答:

6.10 编写一个函数,使用指针形参交换两个整数的值。 在代码中调用该函数并输出交换后的结果,以此验证函数的正确性。

答:

6.11 编写并验证你自己的reset函数,使其作用于引用类型的参数。注:reset即置0。

答:

6.12 改写6.2.1节练习中的程序,使其引用而非指针交换两个整数的值。你觉得哪种方法更易于使用呢?为什么?

答:

6.13 假设T是某种类型的名字,说明以下两个函数声明的区别: 一个是void f(T), 另一个是void f(&T)

答:

void f(T)的参数通过值传递,在函数中T是实参的副本,改变T不会影响到原来的实参。 void f(&T)的参数通过引用传递,在函数中的T是实参的引用,T的改变也就是实参的改变

6.14 举一个形参应该是引用类型的例子,再举一个形参不能是引用类型的例子。

答:

例如交换两个整数的函数,形参应该是引用

当实参的值是右值时,形参不能为引用类型

6.18 为下面的函数编写函数声明,从给定的名字中推测函数具备的功能。

  • (a) 名为compare的函数,返回布尔值,两个参数都是matrix类的引用。
  • (b) 名为change_val的函数,返回vector的迭代器,有两个参数:一个是int,另一个是vector的迭代器。

答:

6.19 假定有如下声明,判断哪个调用合法、哪个调用不合法。对于不合法的函数调用,说明原因。

答:

  • (a) 不合法。calc只有一个参数。
  • (b) 合法。
  • (c) 合法。
  • (d) 合法。

6.20 引用形参什么时候应该是常量引用?如果形参应该是常量引用,而我们将其设为了普通引用,会发生什么情况?

答:

应该尽量将引用形参设为常量引用,除非有明确的目的是为了改变这个引用变量。 如果形参应该是常量引用,而我们将其设为了普通引用,那么常量实参将无法作用于普通引用形参。

6.21 编写一个函数,令其接受两个参数:一个是int型的数,另一个是int指针。 函数比较int的值和指针所指的值,返回较大的那个。 在该函数中指针的类型应该是什么?

答:

6.22 编写一个函数,令其交换两个int指针。

答:

6.23 参考本节介绍的几个print函数,根据理解编写你自己的版本。 依次调用每个函数使其输入下面定义的ij:

答:

6.24 描述下面这个函数的行为。如果代码中存在问题,请指出并改正。

答:当数组作为实参的时候,会被自动转换为指向首元素的指针。 因此函数形参接受的是一个指针。 如果要让这个代码成功运行(不更改也可以运行),可以将形参改为数组的引用。

6.26 编写一个程序,使其接受本节所示的选项;输出传递给main函数的实参内容。

答:

6.27 编写一个函数,它的参数是initializer_list类型的对象,函数的功能是计算列表中所有元素的和。

答:

6.31 什么情况下返回的引用无效?什么情况下返回常量的引用无效?

答:当返回的引用的对象是局部变量时,返回的引用无效;当我们希望返回的对象被修改时,返回常量的引用无效。

6.32 下面的函数合法吗?如果合法,说明其功能;如果不合法,修改其中的错误并解释原因。

答:合法。get函数根据索引取得数组中的元素的引用。

6.33 编写一个递归函数,输出vector对象的内容。

答:

6.36 编写一个函数声明,使其返回数组的引用并且该数组包含10个string对象。 不用使用尾置返回类型、decltype或者类型别名。

答:

6.37 为上一题的函数再写三个声明,一个使用类型别名,另一个使用尾置返回类型,最后一个使用decltype关键字。 你觉得哪种形式最好?为什么?

答:

我觉得尾置返回类型最好,就一行代码。

6.38 修改arrPtr函数,使其返回数组的引用。

答:

6.39 说明在下面的每组声明中第二条语句是何含义。 如果有非法的声明,请指出来。

答:

  • (a) 非法。因为顶层const不影响传入函数的对象,所以第二个声明无法与第一个声明区分开来。
  • (b) 非法。对于重载的函数来说,它们应该只有形参的数量和形参的类型不同。返回值与重载无关。
  • (c) 合法。

6.40 下面的哪个声明是错误的?为什么?

答:

(a) 正确。 (b) 错误。因为一旦某个形参被赋予了默认值,那么它之后的形参都必须要有默认值。

6.41 下面的哪个调用是非法的?为什么?哪个调用虽然合法但显然与程序员的初衷不符?为什么?

答:

(a)非法。第一个参数不是默认参数,最少需要一个实参。

  (b)  合法。

  (c)  合法,但与初衷不符。字符*被解释成int传入到了第二个参数。而初衷是要传给第三个参数。

6.42 给make_plural函数的第二个形参赋予默认实参's', 利用新版本的函数输出单词success和failure的单数和复数形式。

答:

注:

size _t 为了增强程序的可移植性,在不同系统上,定义size_t可能不一样。

经测试发现,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。

6.43 你会把下面的哪个声明和定义放在头文件中?哪个放在源文件中?为什么?

答:全部都放进头文件。(a) 是内联函数,(b) 是声明。

6.44 将6.2.2节的isShorter函数改写成内联函数。

答:

6.45 回顾在前面的练习中你编写的那些函数,它们应该是内联函数吗? 如果是,将它们改写成内联函数;如果不是,说明原因。

答:

一般来说,内联机制用于优化规模小、流程直接、频繁调用的函数。

6.47 改写6.3.2节练习中使用递归输出vector内容的程序,使其有条件地输出与执行过程有关的信息。 例如,每次调用时输出vector对象的大小。 分别在打开和关闭调试器的情况下编译并执行这个程序。

答:

6.48  说明下面这个循环的含义,它对assert的使用合理吗?

答:

不合理。从这个程序的意图来看,应该用

6.51 编写函数f的4版本,令其各输出一条可以区分的消息。 验证上一个练习的答案,如果你的回答错了,反复研究本节内容直到你弄清自己错在何处。

答:

6.54 编写函数的声明,令其接受两个int形参并返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针。

答:

6.55 编写4个函数,分别对两个int值执行加、减、乘、除运算;在上一题创建的vector对象中保存指向这些函数的指针。

答:

6.56 调用上述vector对象中的每个元素并输出结果。

答:

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值