C++primer
文章平均质量分 65
Pierce_Liu
以前我没得选择,现在我想做个码农
展开
-
C++primer 第八章
8.4#include #include #include #include using namespace std;int main(){ ifstream input("read.txt"); if (!input) { cerr << "Can't open read.txt" << endl; return -1; } vector svec; str原创 2016-09-05 20:47:45 · 357 阅读 · 0 评论 -
14.6 && 14.7节练习
练习14.27 为你的StrBlobPtr类添加递增和递减运算符。StrBlobPtr& StrBlobPtr::operator++(){ check(curr, "increment past end of StrBlobPtr"); ++curr; return *this;}StrBlobPtr& StrBlobPtr::operator--(){ --curr; c原创 2016-06-20 22:48:47 · 412 阅读 · 0 评论 -
14.4 && 14.5节练习
练习14.20 为你的Sales_data类定义加法和复合赋值运算符。ales_data& Sales_data::operator+=(const Sales_data& rhs){ book_no = rhs.isbn(); book_sold += rhs.book_sold; revenue += rhs.revenue; return *this;}Sales_da原创 2016-06-20 19:54:13 · 366 阅读 · 0 评论 -
14.3节练习
14.13 你认为Sales_data类还应该支持哪些其他算术运算符(参见124页)?如果有的话,请给出定义。加法和减法运算符。(假设程序两个对象指向同一本书)下列重载运算符设为友元。Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs){ Sales_data sum = lhs; sum +=原创 2016-06-20 17:48:12 · 327 阅读 · 0 评论 -
14.1 && 14.2节练习
14.1在什么情况下重载运算符与内置运算符有所区别?在什么情况重载的运算符又与内置类型一样?#include #include using namespace std;int main(){ string s = "world"; string t = s + "!"; string u = "hi" + s; // 重载的运算符要求左侧运算对象要求其是该类型 int i =原创 2016-06-19 23:30:33 · 481 阅读 · 0 评论 -
13.6节练习
练习13.45 解释右值引用和左值引用的区别。一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值。左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象。练习13.46 什么类型的引用可以绑定到下面的初始器上。int f() { return 1; } vector vi(100); int && ri = f(原创 2016-06-17 08:45:50 · 694 阅读 · 0 评论 -
17.2节练习
练习17.9 解释下列每个bitset对象所包含的位模式:#include #include #include using namespace std;int main(){ bitset bitvec(32); //10进制32 cout << bitvec << endl; bitset bv(011); // 8进制 011 cout << bv << en原创 2016-07-05 17:00:40 · 451 阅读 · 0 评论 -
17.1节练习
练习17.1 定义一个保存三个int值得tuple,并将其成员分别初始化为10、20和30。#include #include #include using namespace std;int main(){ tuple iple{ 10,20,30 }; cout (iple) << endl;}练习17.2 定义一个tuple,保存一个string、一个vector和一原创 2016-07-05 10:48:05 · 360 阅读 · 0 评论 -
16.5节练习
练习16.63 定义一个函数模板,统计一个给定值在一个vector中的出现次数。测试你的函数,分别传递给它一个double,int和string的vector。#include #include #include #include using namespace std;template std::size_t count(const vector &item, const T &原创 2016-07-04 16:30:59 · 377 阅读 · 0 评论 -
16.4节练习
练习16.51&&16.52 调用本节中的每个foo,确定sizeof...(Args)和sizeof..(rest)分别返回什么?并验证。#include using namespace std;template void foo(const T &t, const Args& ... rest){ cout << sizeof...(Args) << " " << sizeof.原创 2016-07-04 15:06:09 · 435 阅读 · 0 评论 -
13.5节练习
练习13.39 编写你自己版本的StrVec,包括自己版本的reserve,capacity和resize。#include #include #include using namespace std;class StrVec {public: StrVec() :elements(nullptr), first_free(nullptr), cap(nullptr) {} S原创 2016-06-16 19:27:34 · 466 阅读 · 0 评论 -
16.3节练习
练习16.48 编写你自己版本的debug_rep函数。template string debug_rep(const T&);template string debug_rep(T*);string debug_rep(const string&);string debug_rep(char*);string debug_rep(const char*);练习16.49&&1原创 2016-07-02 21:45:20 · 371 阅读 · 0 评论 -
13.4节练习
练习13.33 为什么Message的成员save和remove的参数是一个Folder&?为什么我们不将参数定义为Folder或是const Folder&?目的是从Folder中添加/删除Message。定义Floder添加/删除的是Message的副本,不是对象本身,而const Folder&将使得不能删除对象。练习13.34 编写本节所描述的Message。(见1原创 2016-06-16 19:26:59 · 496 阅读 · 0 评论 -
13.3节练习
练习13.29 解释swap(HasPtr&, HasPtr&)中对swap的调用不会导致递归循环。程序未找到自定义的swap函数,故调用的是标准库函数中的swap函数。练习13.30 为你的类值版本的HasPtr编写swap函数,并测试它。为你的swap函数添加一个打印语句,指出函数什么时候执行。void swap(HasPtr &lhs, HasPtr &rhs){ u原创 2016-06-16 08:42:38 · 841 阅读 · 0 评论 -
16.2节练习
练习16.32 在模板实参推断过程中发生了什么?从函数实参来确定模板实参的过程被称为模板实参推断。在模板实参推断过程中,编译器使用函数调用中的实参类型在寻找模板实参,用这些模板实参生成的函数版本与给定的函数调用最为匹配。练习16.33 指出在模板实参推断过程中允许对函数实参进行的两种类型转化。const转换:可以将一个非const对象的引用/指针传递给一个const引用/指针形原创 2016-07-02 17:02:19 · 868 阅读 · 0 评论 -
16.1节练习
练习16.1 给出实例化的定义。编译器用推断出的模版参数来为我们实例化一个特定版本的函数。练习16.2 编写并测试你自己版本的compare函数。#include using namespace std;template int compare(const T &v1, const T &v2){ if (v1 < v2) { return -1; } if (v2原创 2016-07-02 10:09:00 · 794 阅读 · 0 评论 -
14.8节练习
14.33 一个重载的函数调用运算符应该接受几个运算对象?一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或类型上有所不同即可。14.34 定义一个函数对象类,令其执行if-then-else的操作:该类的调用运算符接受三个形参,它首先检查第一个形参,如果成功返回第二个形参的值;如果不成功返回第三个形参的值。#include using namespace st原创 2016-06-21 09:22:31 · 477 阅读 · 0 评论 -
14.9 节练习
练习14.45 编写类型转换运算符将一个Sales_data对象分别转换成string和double,你认为这些运算符的返回值应该是什么? operator std::string() const { return isbn(); } operator double() const { return revenue; }练习14.46 你认为应该为Sale_data原创 2016-06-21 19:33:50 · 530 阅读 · 2 评论 -
C++primer 第七章
本章主要一步步构造类。7.2#pragma once#include #include using namespace std;struct Sales_data { std::string isbn() const { return bookNo; } Sales_data& combine(const Sales_data&); std::string bookNo;原创 2016-09-05 14:43:59 · 385 阅读 · 0 评论 -
C++primer 第五章
5.24#include #include using namespace std;int main(){ double a, b; cin >> a >> b; if (b == 0) { throw runtime_error("Divisor Can't be zero"); } cout << a / b << endl;}5.25#include原创 2016-09-05 09:07:41 · 291 阅读 · 0 评论 -
C++primer 第四章
4.10 && 4.11#include using namespace std;int main(){ int ival; while (cin >> ival && ival != 42) { cout << ival << " "; } cout << endl; int a = 9; int b = 7; int c = 10; int d = 11原创 2016-09-04 20:47:40 · 332 阅读 · 0 评论 -
C++primer 第三章
3.2#include #include using namespace std;int main(){ string s; while (getline(cin, s)) { cout } // while (cin >> s) {// cout // }//原创 2016-09-03 22:33:17 · 281 阅读 · 0 评论 -
C++primer 第二章
2.8#include using namespace std;int main(){ cout << "2\12" << endl; cout << "2\t\x4d\n" << endl;}原创 2016-09-03 14:58:19 · 496 阅读 · 0 评论 -
C++Primer 第一章
1.1 1.2略1.3#include using namespace std;int main(){ cout << "Hello, world" << endl;}1.4#include using namespace std;int main(){ int v1 = 3; int v2 = 5; cout << "Addtion: " << v1 +原创 2016-09-03 11:33:03 · 329 阅读 · 0 评论 -
18.1节练习
练习18.1 在下列throw语句中异常对象的类型是什么?如果将(b)中的throw语句写成了throw p将发生什么情况?(a) range_error("error"); throw r;(b) exception *p = &r; throw *p;a和b中的异常对象都是range_error。throw p找不到匹配的catch对象,调用ter原创 2016-07-09 14:24:08 · 608 阅读 · 0 评论 -
15.6节练习
练习15.23 假设第550页中的D1类需要覆盖它继承而来的fcn函数,你应该如何对其进行修改?如果你修改之后fcn匹配了Base中的定义,则该节的那些调用语句将如何解析?int fcn() override;指向Base的指针调用Base::fcn(),指向D1的指针调用D1::fcn(),指向D2的指针调用D2::fcn()。除了D2中有可调用的fcn(int)之外,在Base和D原创 2016-06-23 17:55:58 · 373 阅读 · 0 评论 -
15.5节练习
练习15.18 假设给定了第543页和第544页的类,同时已知每个对象的类型如注释所示,判断下面的哪些赋值语句是合法的。解释那些不合法的语句为什么不被允许:原创 2016-06-23 11:29:07 · 408 阅读 · 0 评论 -
15.4节练习
练习15.15 定义你自己的Disc_quote和Bulk_quote。class Disc_quote :public Quote {public: Disc_quote() = default; Disc_quote(const std::string &book, double price, std::size_t qty, double disc) : Quote(boo原创 2016-06-22 15:40:12 · 318 阅读 · 0 评论 -
17.5节练习
练习17.5.34 编写一个程序,展示如何使用表17.17和表17.18中的每个操作符。#include using namespace std;int main(){ int val = 10; float val2 = 10.0; bool bool_val = val; cout << boolalpha << bool_val << noboolalpha << end原创 2016-07-07 20:27:51 · 345 阅读 · 0 评论 -
17.4节练习
练习17.28 编写函数,每次调用生成并返回一个均匀分布的随机unsigned int。#include #include using namespace std;unsigned rand_static(){ static default_random_engine e; static uniform_int_distribution u; return u(e);}un原创 2016-07-07 20:26:47 · 451 阅读 · 0 评论 -
17.3节练习
练习17.14 编写几个正则表达式,分别触发不同错误。运行你的程序,观察编译器对每个错误的输出。#include #include #include using namespace std;int main(){ try { regex r("[[:alnum:]+\\.(cpp|cxx|cc)$", regex::icase); } catch(regex_error原创 2016-07-07 20:26:14 · 477 阅读 · 0 评论 -
15.3节练习
15.11 为你的Quote类体系添加一个名为debug的函数,令其分别显示每个类的数据成员。void Quote::debug()const{ cout << "bookNo: " << bookNo << " price: " << price;}void Bulk_Quote::debug()const{ cout << "min_pty: " << min_qty << "原创 2016-06-22 11:20:17 · 453 阅读 · 0 评论 -
15.2节练习
练习15.1 什么是虚成员?基类希望其派生类进行覆盖的函数,任何构造函数之外的非静态都可以是虚函数。#include #include using namespace std;class Quote { friend double print_total(ostream&,const Quote&, size_t);public: Quote() = default; Quot原创 2016-06-22 07:40:42 · 272 阅读 · 0 评论 -
13.2节练习
练习13.22 假定我们希望HasPtr的行为像一个值。即,对于对象所指向的string成员,每个对象都有一份自己的拷贝。我们将在下一节介绍拷贝控制成员的定义。但是,你已经学习了定义这些成员所需的所有知识。在继续学习下一节之前,为HasPtr编写拷贝构造函数和拷贝赋值运算符。class HasPtr {public: HasPtr() = default; HasPtr(const st原创 2016-06-15 17:03:56 · 808 阅读 · 0 评论 -
13.1节练习
练习13.1 拷贝构造函数是什么?是什么时候使用它?接受对象类型本身的引用的构造函数。当要求编译器将右侧运算符对象拷贝到正在创建的对象中,如果需要的话还要进行类型转换。练习13.2 解释为什么下面的声明是非法的:Sales_data::Sales_data(Sales_data rhs);rhs要拷贝给参数匹配的构造函数,此时需要调用拷贝构造函数,然后得调用上述函数,如此无原创 2016-06-15 08:21:34 · 1318 阅读 · 0 评论 -
10.3.3节练习
练习10.20 标准库定义了一个名为count_if的算法。类似find_if,此函数接受一对迭代器,表示一个输入范围,还接受一个谓词,会对输入范围中每个元素执行。count_if返回一个计数值,表示谓词有多少次为真。使用count_if重写我们程序中统计有多少单词长度超过6的部分。#include #include #include #include using namespace st原创 2016-06-04 10:33:09 · 284 阅读 · 0 评论 -
10.3.2 节练习
练习10.14 编写一个lambda,接受两个int,返回它们的和。#include using namespace std;int main(){ int a = 7, b = 9; auto sum = [a,b]() {return a + b; }; cout << sum() << endl; return 0;}练习10.15 编写一个lambda,原创 2016-06-04 08:04:10 · 307 阅读 · 0 评论 -
10.3.1节练习
练习10.11 编写程序,使用stable_sort和isShort将传递给你的elimDups版本的vector排序。打印vector的内容,验证你的程序的正确性。#include #include #include #include using namespace std;void elimDups(vector &);bool isShort(const string &,原创 2016-06-03 20:10:24 · 379 阅读 · 0 评论 -
10.2.3节练习
练习10.9 实现你自己的elimDups。测试你的程序,分别在读取输入后、调用unique后以及调用erase后打印vector的内容。#include #include #include #include using namespace std;void elimDups(vector &);int main(){ string word; vector text; w原创 2016-06-03 17:09:40 · 387 阅读 · 0 评论 -
10.2.2节练习
练习10.6 编写程序,使用fill_n将一个序列中的int值都设置为0。#include #include using namespace std;int main(){ vector val{ 8,1,2,3,4,5 }; fill_n(val.begin(), val.size(), 0); for (auto i : val) { cout << i << " ";原创 2016-06-03 16:27:55 · 454 阅读 · 0 评论