C++Primer第五版 第六章习题答案(31~40)

原创 2017年01月14日 17:04:24

31:

知识点1:返回的引用无效:局部临时变量或者局部对象的引用对于返回都是无效的,因为在函数终止之后,局部变量或者对象的引用不再指向有效的内存区域。若是常量在函数调用之前存在,引用即可用。

知识点2:可以对返回值是非常量引用的函数结果赋值。

举个例子:

#include <iostream>
#include<string>
using namespace std;

char &Get_val(string &a, int ix)//函数的声明及定义,接受两个参数,返回类型为非常量引用,此处a是否为引用不大影响,最好是引用,节省内存
{
	return a[ix];//字符串某一位置的字母
}
int main(int argc, char *argv[])
{	
	string s = "an apple ";
	cout<<"字符串修改前为:"<<s<<endl;
	Get_val(s,0) = 'A';//可以对非常量的引用返回值赋值
	cout<<"字符串修改后为:"<<s<<endl;	
	return 0;//代表执行成功
}

32:

正确的程序,返回的是数组第1~10个元素。


33:

知识点1:main()函数不可以调用它自己。

#include <iostream>
#include<string>
#include<vector>
using namespace std;

void Get_val(vector<int> a, int ix)//函数的声明及定义,接受两个参数
{
	if (ix != -1)
	{
		cout<<a[ix]<<endl;
		ix--;
		Get_val(a,ix);//递归
	}
}
int main(int argc, char *argv[])
{	
	int a[10] = {2,2,3,6,5,4,7,8,55,5};
	vector<int> Example(a,a+10);
	Get_val(Example,Example.size()-1);//注意下标从0开始
	return 0;//代表执行成功
}

34:

会出现val=0的情况,如果传入的参数为负数,那么将永远不会停止,所以判断条件最好不要用等号


35:

--在后是先用后减,达不到我们减一的目的。结果就是一直使用val循环


36:

知识点:由于数组不能被拷贝,所以函数不可以返回数组,但是我们可以返回函数的指针。利用的是类型别名的方法。

1、声明返回数组指针的函数:

例:对于函数的定义形式需要了解

int (*func(int val))[10];//括号要对,并且维数必须标明
/************************************************************
     type (*function_name(parameter list))[dimension] 
逐层的理解:func(int i),名为func的函数有一个int型的参数i
  (*func(int i)),表明我们可以对函数返回的结果进行解引用操作
  (*func(int i))[10],表明对函数的解引用可以得到大小为10的数组
  int (*func(int i))[10],表示数组中的元素是int类型
************************************************************/

2、尾置返回类型(此为C++11新标准,有兴趣的可以研究下)

3、使用decltype,已知函数的返回值时,可以使用关键字decltype表示返回类型为指针


此题写法较为自由:

string (&func(string (&arrStr)[10]))[10]

37:

using ArrT = string[10];
ArrT& func1(ArrT& arr);//使用类型别名

auto func2(ArrT& arr) -> string(&)[10]; //使用尾置返回类型

string arrS[10];
decltype(arrS)& func3(ArrT& arr);//使用decltype关键字

个人觉得第二种方式比较好,既然是C++11的新标准,那么肯定有它创新的意义所在,简短方便


38:

decltype(arrStr)& arrPtr(int i)
{
          return (i % 2) ? odd : even;
}

39:

知识点1:函数的重载必须有形参数量或者形参类型上的不同

知识点2:顶层const不影响传入函数的对象

知识点3:此小节虽然只有一题,但是函数的重载是一个很重要的知识点,需要多看,深入理解

(a):错误,只是重复生命了

(b):错误

(c):正确


40:

知识点:一旦函数的某个形参被赋予了默认值,他后面所有的参数都必须有默认值

(b)是错误的。


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C++Primer第五版——习题答案+详解(完整版)

C++Primer第五版——习题答案详解       看的也比较快,但是有很多东西确实用不上,所以很多都没有深入的探讨,但是知识点覆盖的很全面,每一道题涉及的知识点我都写上简单的解释了。      ...

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

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

使用 IntelliTrace(智能跟踪) 调试应用程序

1、工具--选项-IntelliTrace

C++Primer第五版 第十二章习题答案(1~10)

1:知识点1:对象生命周期:全局对象在程序启动时分配,在程序结束时销毁。局部自动对象,当我们进入其定义所在程序块时被创建,在离开块时被销毁。局部static对象在第一次使用前分配,在程序结束时销毁 知...

c++ primer第五版(中文)习题答案 第一章-开始

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。 写完第十章习题,开始从头开始,把前面的习题全部完成,书也顺序看下去。习题解答 1.1 查阅你使用的编译器的文档,确定它所使用的文件命...
  • xhxwd
  • xhxwd
  • 2015-10-22 22:12
  • 5720

C++Primer第五版 第一章习题答案(部分)

1.9: #include using namespace std; void main() { int i=50; int sum = 0; while (i >= 50 && i <= 1...

C++Primer第五版 第十三章习题答案(31~40)

31: #include #include #include #include using namespace std; class Hasptr1 { friend void swap(Ha...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)