![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【C++Primer习题】
文章平均质量分 59
MISAYAONE
勤学如春起之苗,不见其增,日有所长。
展开
-
C++Primer第五版 第十二章习题答案(11~20)
11:知识点1:理解变量的销毁与其内存的释放之间的关系:内置类型的指针在离开作用域时,本身会被销毁,但是其指向的内存空间什么都不会发生,必须以显式的delete进行释放空间。智能指针在离开作用域时,本身也会被销毁,并且计数器减一,当其计数器为0且只有一个智能指针指向该对象时,该对象的内存空间会被释放。如若用智能指针的get()函数得到的一个内置指针来初始化一个临时的智能指针,一旦该内置指针被释放,原创 2017-03-05 09:43:12 · 10245 阅读 · 42 评论 -
C++Primer第五版 第十六章习题答案(21~30)
21:知识点1:一个类无论是类模版还是普通类,都可以将其成员函数定义为模版,称之为成员模版,但是成员模版不能是虚函数debug.h#ifndef DEBUG_H#define DEBUG_Hclass Debugdelete{public: Debugdelete(ostream &s = cerr):os(s){}//构造函数 template void operator原创 2017-03-16 09:44:50 · 4580 阅读 · 17 评论 -
C++Primer第五版 第十六章习题答案(11~20)
类模版也是相当的重要,遇到过很多次,好好理解吧11:知识点1:类模版的定义:与函数模版不同的是,编译器不会为类模版推断模版参数类型,所以我们在使用类模版时,需要显式地指出元素的类型,在其定义中,模版参数可以当作类型使用,用来表示类保存的元素的类型:比如说类中保存了一个T类型的vector变量知识点2:我们可以将类中元素访问操作的返回类型定义为T&,也就是模版参数的引用,在被实例化之后,T会原创 2017-03-16 09:41:02 · 5562 阅读 · 7 评论 -
C++Primer第五版——习题答案+详解(完整版)
C++Primer第五版——习题答案详解 看的也比较快,但是有很多东西确实用不上,所以很多都没有深入的探讨,但是知识点覆盖的很全面,每一道题涉及的知识点我都写上简单的解释了。 文中代码的中文注释也尽量都写上,自己皆编译通过。 水平有限,如有有误之处,希望大家不吝指教! 下面的链接是第一章:全部题目(第一章基础较多)http:/原创 2016-12-21 16:11:30 · 331671 阅读 · 103 评论 -
C++Primer第五版 第十九章习题答案(21~26)
21、22、23:知识点1:union是一种特殊的类,可以包含多个数据成员,但是在任意时刻只能有一个数据成员可以有值,其他成员属于未定义的状态,分配给union的内存只要能存储它的最大数据成员即可知识点2:union中不能含有引用类型的成员,但不可继承、不含有虚函数知识点3:union的名字就相当于一个类型名,可以使用一对花括号显式初始化:union Token {};//后面的分号勿原创 2017-03-24 09:43:14 · 2860 阅读 · 9 评论 -
C++Primer第五版 第十六章习题答案(1~10)
1:知识点1:面对对象编程OOP和泛型编程都能处理在编写程序时不知道类型的情况,而OOP能处理类型在程序运行之前都未知的情况,在泛型编程中,在编译时就能获知类型了知识点2:容器、迭代器、算法都是泛型编程的例子知识点3:模版是C++泛型编程的基础,一个模版就是一个类或函数的蓝图或者说是公式:例如在使用vector这样的泛型类型,或者是find函数这样的泛型类型,我们可以将蓝图转换为特定的类或原创 2017-03-14 09:30:56 · 5563 阅读 · 7 评论 -
C++Primer第五版 第十五章习题答案(41~42)
41:非智能指针,所有的new都需要进行手动delete.42:写出自己的思路吧,就不具体实现了(a):这一小问感觉有点问题,描述不清楚。个人理解:将文件读入之后,每行保存在一个vector中,根据输入单词,每行查询,输出对应单词(b):重新定义一个类,将每次的查询结果用一个map保存起来就好了,int为编号,map为查询结果(c):指定文本范围,根据输入限制一下vecto原创 2017-03-14 09:27:58 · 2979 阅读 · 0 评论 -
C++Primer第五版 第十五章习题答案(31~40)
后面的题目主要是进行练习,即使是照搬书本上的例子,也要做一做31:知识点1:继承体系:is a ,和has a 的区别。知识点2:将层次关系隐藏与接口类之中,保存一个基类(抽象基类)派生类的对象的指针32:拷贝:调用合成的拷贝构造函数,将智能指针q的内容复制到新对象的对应成员,使智能指针q计数+1移动:调用合成的移动构造函数,将智能指针q的内容移原创 2017-03-14 09:27:16 · 4784 阅读 · 17 评论 -
C++Primer第五版 第十九章习题答案(11~20)
11:知识点1:枚举类型使得我们可以将一组整型常量组织在一起,但是每一个枚举类型都定义了一种新的类型知识点2:C++11新标准引入了限定作用域的枚举类型,带有class或struct关键字的,就是限定作用域的枚举类型,形式为enum (class/struct) XX { 枚举成员 };,注意后面需要加分号结尾,若enum没有名字,那么我们只能在定义时初始化该对象知识点3:在限定作用域的枚原创 2017-03-23 09:30:13 · 3127 阅读 · 4 评论 -
C++Primer第五版 第十九章习题答案(1~10)
C++特殊的工具和技术1:知识点1:new和delete运算符的实现细节:new的操作过程:第一步、new表达式调用operator new(或者 operator new[])的标准库函数,该函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或数组)。第二步、编译器运行相应的构造函数以构造这些对象,并为其传入初始值。第三步、对象分配了空间并构造完成,返回一个指向该对象原创 2017-03-23 09:26:14 · 4082 阅读 · 11 评论 -
C++ 关于“不允许使用数据成员初始值设定”的问题
这应该算是C++11新标准的一个重大的改动了!建议使用VS2015使用新标准!C++11 之前的标准是不允许在类内初始化非静态数据成员的,只有静态常量整型数据成员,才可以在类中初始化。具体原因可以看下列原因(旧版):(1)类只是一个抽象类型,并不是实体的东西,利用这个抽象类型会实例化成不同的个体,每个个体的特征(数据成员)都不一样,如果在类定义中将特征初始化了,岂不是破坏了抽象性,原创 2017-03-13 09:36:50 · 17072 阅读 · 0 评论 -
C++Primer第五版 第十五章习题答案(21~30)
21:发挥自己的想象力吧!#ifndef FLOWER_H#define FLOWER_H#include using namespace std;class Flower//花店花朵{public: Flower();//默认构造函数 Flower(const string& s,double sale_pice):name(s),Price(sale_pice){}//原创 2017-03-13 09:35:58 · 6706 阅读 · 15 评论 -
C++Primer第五版 第十五章习题答案(11~20)
11:知识点1:当我们使用引用或者指针调用一个虚成员函数时才会执行动态绑定,因为我们知道在程序运行时才知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义知识点2:引用和指针的静态类型与动态类型不同的这一事实是C++语言支持多态性的根本所在(必须是虚函数)知识点3:一个派生类的函数成员如果覆盖了基类的继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致,返回类型也必须相匹原创 2017-03-12 09:39:06 · 6729 阅读 · 16 评论 -
C++Primer第五版 第十八章习题答案(21~30)
21:知识点1:多重继承是指从多个基类中产生派生类的情况,多重继承的派生类继承了所有父类的属性知识点2:继承的访问说明符被忽略的话,class默认为private,struct默认为public知识点3:构造一个派生类对象时将会同时构造并初始化它所有的基类子对象,如若不是显示初始化,则其会使用基类的默认构造函数进行初始化,基类的构造顺序与派生类列标准基类出现的顺序一致知识点4:C++1原创 2017-03-21 09:23:45 · 3304 阅读 · 13 评论 -
C++Primer第五版 第十三章习题答案(51~58)
51:P418已经说的很清楚,使用的是移动操作,因为返回值相当于一个表达式,为右值52:rhs是一个非引用的参数,所以需要进行拷贝初始化,依赖于实参的类型,拷贝初始化要么使用拷贝构造函数要么使用移动构造函数,左值被拷贝,右值被移动hp的第一个赋值中,右侧为左值,需要进行拷贝初始化,分配一个新的string,并拷贝hp2所指向的stringhp的第二个赋值中,直接调用std::m原创 2017-03-11 09:32:31 · 4232 阅读 · 19 评论 -
C++Primer第五版 第十三章习题答案(21~30)
21:知识点:判断一个类是否需要拷贝控制函数成员,首先判断其是否需要自定义版本的析构函数,如果需要,则拷贝控制成员函数都需要。由于这两个类中的指针为智能指针,可以自动控制内存的释放,所以使用类的合成析构函数即可。另外类默认的拷贝控制成员对于智能指针的拷贝也不需要自定义版本来修改,所以全部定义为 =default 即可22:知识点1:管理类外资源的类必须定义拷贝控制成员知识点2:原创 2017-03-07 10:00:29 · 7673 阅读 · 33 评论 -
C++Primer第五版 第十三章习题答案(41~50)
41:就是前置先加后用,后置先用后加,first_free指向的是一个空位置,前置的话会跳过一个空位置。42:本章所实现的StrVec类属于简化版本的容器类,只适用于string,运行时可动态分配内存的大小43:使用for_each和lambda表达式可能会更好一点,无需循环,语义更加明显 void free() { if (elements) {//原创 2017-03-10 09:36:04 · 6449 阅读 · 8 评论 -
C++Primer第五版 第十三章习题答案(31~40)
31:#include #include#include#includeusing namespace std;class Hasptr1{ friend void swap(Hasptr1&,Hasptr1&); friend bool operator<(const Hasptr1& s1,const Hasptr1& s2); friend void show(ve原创 2017-03-10 09:34:19 · 8138 阅读 · 19 评论 -
C++Primer第五版 第七章习题答案(1~10)
1:知识点1:类的定义方法:struct和class两种方法的用法和区别。知识点2:类内成员的初始化方法:成员初始化列表。编译器会调用构造函数初始化成员,可以被重载。首先举个例子方便于理解:#include #include#includeusing namespace std;/*C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct原创 2017-02-16 08:52:17 · 18206 阅读 · 22 评论 -
C++Primer第五版 第四章习题答案(1~10)
1:运算符优先级的问题主要记住小括号的利用、算术>逻辑>关系。求值结果为:1052:括号是无视优先级和结合律的,加上括号意味着很大的改变(a) 可改为 *(vec.begin()) (b)可改为 (*vec.begin()+1)3:复合表达式的处理:使用括号强制达到目的、重复改变可能会导致错误。当然是可以的啦,原创 2016-12-18 15:31:00 · 13401 阅读 · 10 评论 -
C++Primer第五版 第十六章习题答案(31~40)
31:unique_p是保存删除器函数的指针,所以需要一次跳转操作,并不会内联而是跳转32:知识点1:从函数实参到模版实参的过程被称为模版实参推断,在这个过程中,可能会发生类型转换知识点2:只有很有限的几种方式会发生类型转换1:非const对象的引用或者指针到const对象的引用或者指针(const到非const是不合法的)(顶层const会被忽略)2:若函数参数不是引用的原创 2017-03-17 09:14:12 · 4284 阅读 · 22 评论 -
C++Primer第五版 第十二章习题答案(1~10)
1:知识点1:对象生命周期:全局对象在程序启动时分配,在程序结束时销毁。局部自动对象,当我们进入其定义所在程序块时被创建,在离开块时被销毁。局部static对象在第一次使用前分配,在程序结束时销毁知识点2:除了static和自动对象外,C++还支持动态对象的分配。动态分配的对象的生存期与它们在哪里创建无关,只有被显示的释放时,这些对象才会被销毁知识点3:动态对象的释放是编程中极其容易出问题原创 2017-03-03 09:45:58 · 12174 阅读 · 35 评论 -
深度探索C++ 对象模型【第五章2】
1:当C++类导入继承机制,出现虚函数之后,vptr使得class产生了膨胀作用构造函数附加了代码,将vptr初始化class必须合成一个拷贝构造函数和赋值构造函数,其现在是nontrival的(简单的位拷贝不能满足需求)。但其默认的析构函数仍然是trival的2:C++标准要求编译器尽量延迟必要成员函数(构造、拷贝)的实际合成操作,直到真正需要时才合成。3:拷贝构造函原创 2017-11-08 21:32:56 · 412 阅读 · 0 评论 -
C++Primer第五版 第六章习题答案(31~40)
31:知识点1:返回的引用无效:局部临时变量或者局部对象的引用对于返回都是无效的,因为在函数终止之后,局部变量或者对象的引用不再指向有效的内存区域。若是常量在函数调用之前存在,引用即可用。知识点2:可以对返回值是非常量引用的函数结果赋值。举个例子:#include #includeusing namespace std;char &Get_val(string &a, in原创 2017-01-14 17:04:24 · 14807 阅读 · 23 评论 -
C++Primer第五版 第九章习题答案(1~10)
1:知识点1:几种顺序容器的特点vector:可变大小,支持快速随机访问,尾部插入数据很快deque:双端队列。支持快速随机访问,头部插入数据很快list:双向链表。支持双向顺序访问,在其任何位置插入删除数据都很快array:固定大小数组,不能改变大小。(注意这里与普通的内置数组类型是不一样的)string:与vector类似,专用于保存字符。知识点2:在通常情况下,使用v原创 2017-02-24 09:25:32 · 13490 阅读 · 52 评论 -
C++Primer第五版 第十一章习题答案(11~20)
11:知识点:当我们使用decltype作用于某个函数时,它返回函数类型而非指针类型,因此我们需要显示的加上*已表明我们需要返回指针。作用:选择并返回操作数的类型,若为函数,则类型为函数的返回类型using compareType = bool (*)(const Sales_data& lhs, const Sales_data& rhs);//使用using来代替函数类型12:原创 2017-03-01 09:33:17 · 9001 阅读 · 43 评论 -
C++Primer第五版 第六章习题答案(41~50)
41:知识点1:函数反复调用的过程中重复出现的形参,这样的值被称为默认实参。该参数在使用过程中可以被用户指定,也可以使用默认数值知识点2:调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。知识点3:一旦某个形参被赋予了默认值,其后所有形参都必须有默认值。知识点4:顺序很重要!在设计函数时,将默认值的形参放在后面。知识点5:在给定的作用域中,一个形参只能被赋予一次默认实参,原创 2017-02-15 09:59:20 · 11181 阅读 · 31 评论 -
C++Primer第五版 第七章习题答案(11~20)
11:知识点1:构造函数—特殊的成员函数,用来控制对象的初始化过程。无返回类型,可重载,不能被声明为const.知识点2:若无,则有默认的构造函数,是编译器自己隐式的定义的。又称合成的默认构造函数。知识点3:某些类是不能使用默认的构造函数的,以下三个原因:1:在未声明任何构造函数的前提下,类内对象的初始化将不受控制2:合成的默认构造函数可能会造成不必要的错误,如若没有类内初始值来初始化成员,可能这些成员将是未定义的。原创 2017-02-16 08:52:31 · 10920 阅读 · 9 评论 -
C++Primer第五版 第二章习题答案(31~41)
2.31知识点:顶层const的拷贝不受限制,但是底层const的拷贝的对象必须具有相同的底层const资格。一般来说:非常量可以赋值给常量,反之则不行答案:a:合法;b:不合法,p1是非常量,p2是常量,不能进行赋值操作;c:合法;d:不合法,p3既是底层也是顶层const,所以都得考虑到;e:合法;2.32指向空的指针可以用nullptr或0原创 2016-11-20 09:46:19 · 24821 阅读 · 24 评论 -
C++Primer第五版 第十一章习题答案(21~30)
21:知识点1:向map中添加元素,元素的类型必须是pair,但是并没有现成的pair元素,所以需要在insert()的参数列表中创建一个pairfamilyy.insert({"dsa","das"});//c++11支持familyy.insert (pair("asd","das"));//显示创建一个pairfamilyy.insert(make_pair("de","1"));/原创 2017-03-02 09:33:06 · 6172 阅读 · 11 评论 -
C++Primer第五版 第九章习题答案(41~50)
41:知识点1:标准库string定义了大量的特殊操作,并且各种操作皆可重载,因此数量巨大,可以适当进行浏览,当具体需要某种形式时,再进行翻阅查找知识点2:string的额外构造方法:利用数组、string进行构造 #include<iostream>#include<fstream>#include<sstream>#include<...原创 2017-02-25 09:32:14 · 9239 阅读 · 72 评论 -
C++Primer第五版 第四章习题答案(11~20)
1:(a>b) && (b>c) && (c>d)2:记住:算数>逻辑>关系所以该式等同于:i != (j3:不同类型的赋值,肯定是需要强制类型转换的。赋值运算符满足右结合律。所以结果为:(1): d=3.0 i=3(2): d=3.5 i=34:第一条语句,将变量赋给常量,判断肯定是假。第二条语句,将42赋给变量i,本身没有问题,但是在此此原创 2016-12-18 16:23:27 · 13529 阅读 · 40 评论 -
C++Primer第五版 第七章习题答案(51~58)
51:定义为explicit是为了防止隐式的类型转换int getSize(const std::vector<int>&);//这样的使用是否显得比较迷惑getSize(34);52:知识点:用户可以直接访问成员、且有独特的初始化语法被称为聚合类,有以下几个特点:1:所有成员皆public 2:没有定义任何的构造函数 3:没有类内初始值 4:没有基类,也没有虚函数若想以此方式初始化该类原创 2017-02-22 09:15:35 · 8777 阅读 · 18 评论 -
C++Primer第五版 第五章习题答案(21~25)
21:知识点1:continue语句:终止最近循环中的当前迭代并立即开始下一次迭代。知识点2:它只能出现在for、while、do while的内部。#include #include #include using namespace std;void main(){ string My_string1, My_string2; do { cout<<"请输原创 2017-01-07 10:36:10 · 8705 阅读 · 24 评论 -
C++Primer第五版 第十五章习题答案(1~10)
1:知识点1:面向对象程序设计的三个基本概念:数据抽象、继承和动态绑定(核心概念)数据抽象:将类的接口与实现分离继承:我们可以定义与其他类相似但完全不相同的新类动态绑定:在使用这些彼此相似的类时,在一定程度上忽略他们的区别,统一使用它们的对象知识点2:类的继承构成一种层次关系,在层次根部的为基类,其他类则直接或者间接的从基类中继承而来,称为派生类基类负责定义在层次关系中所有类共原创 2017-03-11 09:33:43 · 7183 阅读 · 6 评论 -
C++Primer第五版 第五章习题答案(11~20)
11:知识点:在Windows中:'\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;'\n' 换行,换到当前位置的下一行,而不会回到行首;在Unix系统里:每行结尾只有“”,即"\n";Windows系统里面,每行结尾是“”,即“\r\n”;Mac系统里:每行结尾是“”,即"\r";。一个直接后果是,Uni原创 2017-01-04 16:16:26 · 15977 阅读 · 93 评论 -
C++Primer第五版 第八章习题答案(1~10)
1:知识点1:IO类分别定义在三个独立的头文件中<`iostream>定义了基于读写流的基本类型 <`fstream>定义了读写命名文件的类型 <`sstream>定义了读写内存string对象的类型 三个头文件皆在标准库中。istream& func(istream &is){ string mm; while(is >> mm) {原创 2017-02-23 09:10:10 · 13700 阅读 · 11 评论 -
C++Primer第五版 第十六章习题答案(41~50)
41:头文件#ifndef REU_TYPE_H#define REU_TYPE_Htemplate auto sum(const T&a,const T&b) ->decltype(a+b)//将函数的返回类型指定为a+b的类型{ return a+b;}#endif REU_TYPE_Hmain.cpp#include #include #include原创 2017-03-17 09:16:00 · 3660 阅读 · 10 评论 -
C++Primer第五版 第十八章习题答案(11~20)
11:what函数是用来返回初始化异常对象信息的,若what中也要抛出异常,是不是就造成无限递归了12:知识点1:传统意义上,可以将全局定义的实体名字定义的很长以避免命名空间污染,这样的名字通常将其名字所属的库作为前缀,但比较费时费力知识点2:命名空间可以更好的防止名字冲突,且避免全局名字的固有限制知识点3:namespace后加命名空间的名字,加上一对花括号就是一个完整的命名原创 2017-03-20 09:31:19 · 3300 阅读 · 2 评论 -
C++Primer第五版 第十八章习题答案(1~10)
大规模应用程序的特殊要求知识点1:异常处理:在独立开发的子系统之间协同处理错误的能力知识点2:命名空间:使用各种库(可能包含独立开发的库)进行协同开发的能力知识点3:多重继承:对比较复杂的应用概念建模的能力1:知识点:C++通过抛出一个表达式来引发一个异常,throw之后的代码将不会被执行,程序控制权将从throw转移到与之匹配的catch模块(即捕获)(若try语原创 2017-03-20 09:26:56 · 4236 阅读 · 3 评论