《C++ Primer》题解
本专栏用于发布《C++ Primer》课后题的答案
唐火
开始人工智能之路了!!!
展开
-
《C++ Primer》10.1节练习
练习10.1:#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { vector<int>vi; int val; vi.push_back(45); vi.push_back(45); vi.push_back(45); vi.push_back(45); for (int i = 1; i <= 45;原创 2021-04-09 22:27:50 · 151 阅读 · 0 评论 -
《C++ Primer》8.3.1节练习
练习8.9:#include <iostream>#include <sstream>#include <string>#include <stdexcept>using namespace std;istream &f(istream &in) { string v; while (in >> v, !in.eof())//直到遇到文件结束符才停止读取 { if (in.bad()) throw原创 2021-04-09 13:20:13 · 204 阅读 · 0 评论 -
《C++ Primer》8.2.1节练习(部分)
练习8.4:#include <iostream>#include <fstream>#include <string>#include <vector>using namespace std;int main() { //打开文件 ifstream in("D:\\CCCCCCCCCCCCCCCCCCC\\yyhaif.txt"); if (!in) { cerr << "无法打开输入文件" << endl;原创 2021-04-09 12:34:11 · 215 阅读 · 0 评论 -
《C++ Primer》8.1.2节练习
练习8.1:#include <iostream>#include <stdexcept>using namespace std;istream &f(istream &in) { int v; while (in >> v, !in.eof()) { if (in.bad()) throw runtime_error("IO流错误"); if (in.fail()) { cerr << "数据错误,请重试:"原创 2021-04-09 11:20:33 · 242 阅读 · 4 评论 -
《C++ Primer》13.1.2节练习
练习13.6:拷贝赋值运算符本身是一个重载的赋值运算符,定义为类的成员函数,左侧运算对象绑定到隐含的this参数,而右侧运算对象是所属类类型的,作为函数的参数,函数返回指向其左侧运算对象的引用。当对类对象进行赋值时,会使用拷贝赋值运算符。通常情况下,合成的拷贝赋值运算符会将右侧对象的非static成员逐个赋予左侧对象的对应成员,这些赋值操作是由成员类型的拷贝赋值运算符来完成的。若一个类未定义自己的拷贝赋值运算符,编译器就会为其合成拷贝赋值运算符,完成赋值操作,但对于某些类,还会起到禁止该类型对象赋值原创 2021-04-06 20:33:44 · 233 阅读 · 4 评论 -
《C++ Primer》13.1.6节练习(部分)
练习13.18:#include <iostream>#include <string>using namespace std;class Employee { private: static int sn; public: Employee() { mysn = sn++; } Employee(const string &s) { name = s; mysn = sn++; } const string &原创 2021-04-06 20:16:16 · 197 阅读 · 0 评论 -
《C++ Primer》13.1.4节练习
练习13.14:这是一个典型的应该定义拷贝控制成员的场合。如果不定义拷贝构造函数和拷贝赋值运算符,依赖合成的版本,则在拷贝构造和赋值时,会简单复制数据成员。对本问题来说,就是将序号简单复制给新对象。因此,代码中对a、b、c三个对象调用函数f,会输出三个相同的序号——合成拷贝构造函数被调用时简单复制序号,使得三个对象具有相同的序号。练习13.15:在此程序中,都是拷贝构造函数在起作用,因此定义能生成新的序号的拷贝构造函数会改变输出结果。但注意,新的输出结果不是0、1、2,而是3、4、5。因为在定义原创 2021-04-06 19:50:21 · 185 阅读 · 0 评论 -
《C++ Primer》13.1.3节练习
练习13.9:析构函数完成与构造函数相反的工作:释放对象使用的资源,销毁非静态数据成员。从语法上看,它是类的一个成员函数,名字是波浪号接类名,没有返回值,也不接受参数。当一个类没有定义析构函数时,编译器会为它合成析构函数。合成的析构函数体为空,但这并不意味着它什么也不做,当空函数体执行完后,非静态数据成员会被逐个销毁。也就是说,成员是在析构函数体之后隐含的析构阶段中进行销毁的。练习13.10:暂时不会!!!练习13.11:~HasPtr(){ delete ps;}练习13.12:原创 2021-04-06 20:34:13 · 168 阅读 · 0 评论 -
《C++ Primer》13.1.1节练习
练习13.1:如果构造函数的第一个参数是自身类类型的引用,且所有其他参数(如果有的话)都有默认值,则此构造函数是拷贝构造函数。拷贝构造函数在以下几种情况下会被使用:●拷贝初始化(用=定义变量)。●将一个对象作为实参传递给非引用类型的形参。●一个返回类型为非引用类型的函数返回一个对象。●用花括号列表初始化一个数组中的元素或一个聚合类中的成员。●初始化标准库容器或调用其insert/push操作时,容器会对其元素进行拷贝初始化。练习13.2:这一声明是非法的。因为对于上一题所述的情况,我们需要调原创 2021-04-06 20:33:23 · 377 阅读 · 5 评论 -
《C++ Primer》14.4节练习(部分)
练习14.20:class Sales_data{ friend Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs); public: Sales_data &operator+=(const Sales_data &rhs);}Sales_data operator+(const Sales_data &lhs,const Sales_data &rhs){原创 2021-04-05 21:24:48 · 159 阅读 · 3 评论 -
《C++ Primer》14.3.2节练习(部分)
练习14.18:练习14.19:原创 2021-04-05 20:30:52 · 97 阅读 · 0 评论 -
《C++ Primer》14.3.1节练习
练习14.16://为strBlob定义==和!=class strBlob{ friend bool operator==(const strBlob &lhs,const strBlob &rhs); friend bool operator!=(const strBlob &lhs,const strBlob &rhs);};bool operator==(const strBlob &lhs,const strBlob &rhs){原创 2021-04-05 11:19:37 · 153 阅读 · 2 评论 -
《C++ Primer》14.3节练习
练习14.13:对于Sales_data类,其实我们并不需要再为它添加其他算术运算符。但是这里我们可以考虑为它实现一个减法运算符。class Sales_data{ friend Sales_data operator-(const Sales_data &lhs,const Sales_data &rhs); friend Sales_data&operator-=(const Sales_data &rhs);};Sales_data operator-(原创 2021-04-05 10:48:53 · 151 阅读 · 0 评论 -
《C++ Primer》14.2.2节练习
练习14.9:输入运算符从给定输入流读取对应类型的对象,存入Sales_data的数据成员中。与输出不同,输入通常要进行一些正确性的判定,并进行相应处理。class Sales_data{ friend istream&operator>>(istream&is,Sales_data &item);};istream&operator>>(istream&is,Sales_data &item){ double pri原创 2021-04-05 10:37:05 · 233 阅读 · 0 评论 -
《C++ Primer》14.2.1节练习
练习14.6:class Sales_data{ friend ostream&operator<<(sotream&os,const Salse_data &item);};ostream&operator<<(ostream &os,const Sales_data &item){ const char *sep = ' '; os<<item.isbn()<<sep<<item原创 2021-04-05 10:14:36 · 131 阅读 · 0 评论 -
《C++ Primer》14.1节练习
练习14.1:不同点:重载操作符必须具有至少一个class或枚举类型的操作数。重载操作符不保证操作数的求值顺序,例如对&&和||的重载版本不再具有“短路求值”的特性,两个操作数都要进行求值,而且不规定操作数的求值顺序。相同点:对于优先级和结合性及操作数的数目都不变。练习14.2:class Sales_data{ friend std::istream&operator>>(std::istream&,Sales_data &); fr原创 2021-04-05 10:14:02 · 158 阅读 · 0 评论 -
《C++ Primer》7.5.2节练习
练习7.41:#include <iostream>#include <string>using namespace std;class Sales_data { friend std::istream &read(std::istream &is, Sales_data &item); friend std::ostream &print(std::ostream &os, const Sales_data &ite原创 2021-04-05 10:12:59 · 116 阅读 · 0 评论 -
《C++ Primer》7.5.1节练习
练习7.36:在类X中,两个数据成员出现的顺序是rem在前,base在后,所以当执行X对象的初始化操作时先初始化rem。如上述代码所示,初始化rem要用到base的值,而此时base尚未被初始化,因此会出现错误。该过程与构造函数初始值列表中谁出现在前面谁出现在后面没有任何关系。修改的方法很简单,只需要把变量rem和base的次序调换即可,形式是:struct X{ X(int i,int j):base(i),rem(base%j){ } int base,rem;};练习7.37:S原创 2021-04-05 10:12:30 · 214 阅读 · 0 评论 -
《C++ Primer》7.4节练习
练习7.33:原创 2021-04-05 10:12:21 · 93 阅读 · 0 评论 -
《C++ Primer》7.3.4节练习
练习7.32:要想让clear函数作为Screen的友元,只需要在Screen类中做出友元声明即可。本题的真正关键之处是程序的组织结构,我们必须首先定义Window_mgr类,其中声明clear函数,但是不能定义它;接下来定义Screen类,并且在其中指明clear函数是其友元;最后定义clear函数。满足题意的程序如下所示:#include <iostream>#include <string>using namespace std;class Window_mgr {原创 2021-04-04 19:35:58 · 224 阅读 · 0 评论 -
《C++ Primer》7.3.3节练习
练习7.31:满足题意的程序如下所示:class X;//声明类型Xclass Y//定义类型Y{ X* x;};class X//定义类型X{ Y y;};类X的声明称为前向声明,它向程序中引入了名字X并且指明X是一种类类型。对于类型X来说,此时我们已知它是一个类类型,但是不清楚它到底包含哪些成员,所以它是一个不完全类型。我们可以定义指向不完全类型的指针或引用,但是无法创建不完全类型的对象。如果试图写成下面的形式,将引发编译器错误。class Y;class X{ Y y原创 2021-04-04 19:00:16 · 254 阅读 · 0 评论 -
《C++ Primer》7.3.2节练习
练习7.27:#include <iostream>#include <cstring>using namespace std;class Screen { private: unsigned height = 0, width = 0; unsigned cursor = 0; string contents; public: Screen() = default; Screen(unsigned ht, unsigned wd): height(原创 2021-04-04 18:43:33 · 247 阅读 · 0 评论 -
《C++ Primer》7.3.1节练习
练习7.23:class Screen { private: unsigned height = 0,width =0; unsigned cursor = 0; string contents;}/*对于Screen类来说,必不可少的数据成员有:屏幕的宽度和高度、屏幕的内容以及光标的当前位置*/练习7.24:class Screen { private: unsigned height = 0,width =0; unsigned cursor = 0; stri原创 2021-04-04 18:10:18 · 186 阅读 · 0 评论 -
《C++ Primer》7.2.1节练习
练习7.20:当非成员函数确实需要访问类的私有成员时,我们可以把它声明成该类的友元。此时,友元可以“工作在类的内部”,像类的成员一样访问类的所有数据和函数。但是一旦使用不慎(比如随意设定友元),就有可能破坏类的封装性。练习7.21:练习7.22:...原创 2021-04-04 17:04:24 · 149 阅读 · 0 评论 -
《C++ Primer》7.2节练习
N原创 2021-04-04 16:41:33 · 162 阅读 · 0 评论 -
《C++ Primer》7.1.4节练习
练习7.11:#include <iostream>#include <cstring>using namespace std;class Sales_data { public: Sales_data() = default; Sales_data(const std::string &book): bookNo(book) {} Sales_data(const std::string &book, const unsigned num,原创 2021-04-04 15:20:00 · 280 阅读 · 0 评论 -
《C++ Primer》7.1.3节练习
练习7.6:#include <iostream>using namespace std;Sales_data add(const Sales_data &lhs,const Sales_data &rhs){ Sales_data sum = lhs; sum.combine(rhs); return sum;}std::istream &read(std::istream &is ,Sales_data &item){ is&原创 2021-04-04 14:19:29 · 264 阅读 · 1 评论 -
《C++ Primer》7.1.2节练习(部分)
练习7.4:class Person { private: string strName;//姓名 string strAddress;//地址};练习7.5:class Person { private: string strName; string strAddress; public: string getName()const { return strName; } string getAddress() const { return原创 2021-04-04 13:54:45 · 126 阅读 · 0 评论 -
《C++ Primer》2.6.1节练习
练习2.39:在类体花括号后加一个分号就好了。练习2.40:代码如下:struct Sales_data{ std::string bookNo;//书籍编号 unsigned units_sold = 0;//销售量 double sellingprice = 0.0;//零售价 double saleprice = 0.0//实售价 double discount = 0.0//折扣};...原创 2021-04-02 19:24:52 · 181 阅读 · 1 评论 -
DevC++如何安装自定义头文件并使用
首先我们打开DevC++,然后点击新建。新建一个控制台应用程序取一个喜欢的文件名。然后会出现如下界面。点击新建单元将头文件源码放入找到空白位置,右键,然后点关闭并保存保存的文件名要为头文件的名字使用这个头文件时,只需要把新建的源文件放在此工程的目录下即可。...原创 2021-04-02 18:28:29 · 4527 阅读 · 0 评论 -
《C++ Primer》2.2.1节练习
#include <iostream>using namespace std;string global_str;int global_int;int main() { int local_int; string local_str; cout << "global_str = " << global_str << endl; cout << "global_int = " << global_int <&l..原创 2021-03-17 23:00:24 · 219 阅读 · 2 评论 -
《C++ Primer》2.1.3节练习
#include <iostream>using namespace std;int main() { cout << "2\x4d\012"; cout << "2\tM\n"; return 0;}//\x4d输出M//\012输出换行//\t输出制表符原创 2021-03-17 22:49:17 · 147 阅读 · 0 评论 -
《C++ Primer》1.51节练习
练习1.20#include <iostream>#include "Sales_item.h"using namespace std;int main() { Sales_item book; cout << "请输入销售记录:" << endl; while (cin >> book) { cout << "ISBN,售出本数,销售额和平均售价为" << book << endl; } retur原创 2021-03-16 00:07:13 · 116 阅读 · 0 评论 -
《C++ Primer》2.1.2节练习
练习2.3#include <iostream>using namespace std;int main() { unsigned u = 10, u2 = 42; cout << u2 - u << endl; cout << u - u2 << endl; int i = 10, i2 = 42; cout << i2 - i << endl; cout << i - i2 <&l原创 2021-03-16 00:06:22 · 119 阅读 · 0 评论 -
《C++ Primer》2.11节练习
练习2.1练习2.2原创 2021-03-16 00:05:52 · 75 阅读 · 0 评论 -
《C++ Primer》1.52节练习
练习1.23#include <iostream>#include "Sales_item.h"using namespace std;int main() { Sales_item trans1, trans2; cout << "请输入若干销售记录:" << endl; if (cin >> trans1) { int num = 1; while (cin >> trans2) if (trans1.isbn原创 2021-03-16 00:05:34 · 115 阅读 · 0 评论 -
《C++ Primer》第一章的 Sales_item.h头文件源码
Sales_item.h 头文件代码如下:#ifndef SALESITEM_H#define SALESITEM_H#include <iostream>#include <string> class Sales_item{public: Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){} Sales_item(std::istream &原创 2021-03-16 00:05:28 · 831 阅读 · 0 评论