5th专题

《C++Primer 5th》 读书笔记2--const

一、const初探 这里主要讲三类:普通对象、引用、指针。 1.普通对象 ①const修饰的对象必须初始化。 ②不能改变其值。 ③只要不改变对象的值,const对象和非const对象没有区别。 ④const与对象类型修饰符可以调换位置,即const int 和int const等价。 2.引用:(绑定的对象的类型) &引用名,比如 int &x 类型名是说将引用绑定到那

《C++ Primer 5th》读书笔记5---重读IO标准库

其实我也想吐槽一下这个标准库。 就理解这个IO方向就搞地很麻烦。 1.#include <iostream>基本输入输出流 这个就我的使用来说,就是表示标准输入(cin),标准输出(cout),或者它们的引用。 方向:cin是一个流对象,与键盘来的数据默认绑定。cout是一个流对象,与去向屏幕或者说终端的数据默认绑定。 把内存当做中心,从键盘输入到内存,就叫做in。

《C++ Primer 5th》读书笔记4---文本查询程序

这是本书第12章也是第二部分的最终一个例程,完成的任务是: 利用标准库,读入一篇文章,然后实现对于任意单词的查询功能。 我先总结一些注意细节或者中间遇到的问题,最后做完习题以后再整个总结。 1.编译时注意事项 我才用的是codeblocks作为IDE,然后使用Document_Query.h作为类申明,Document_Query.cpp作为类实现,然后用main来验证。 每次重新用ID

C++ Primer 5th笔记(10)chapter10 泛型算法 :write

1. fill: 对给定区间全部赋予某值(algorithm.h) 将指定范围内的每个元素都设定为给定的值。如果输入范围有效,则可以安全写入。这个算法只会对输入范围内已存在的元素进行写入操作。 template<class FwdIt, class T> void fill(FwdIt first, FwdIt last, const T& x); fill(vec.begin(),vec.

C++ Primer 5th笔记(10)chapter10 泛型算法 : read

标准库提供一组不依赖特定的容器类型的共性算法 指定迭代器范围, eg. [begin, end)这种左闭包3种类型: 只读、写、sort 1. find 查询 template<class InIt, class T> InIt find(InIt first, InIt last, const T& val); 查询迭代器指定范围[first, last)范围内是否有val值。如果有,则

C++ Primer 5th笔记(9)chapter9 顺序容器 string

1. string构造 string s; 定义一个新的空string对象,命名为sstring s(cp); 定义一个新的string对象,用cp所指向的(以空字符null结束的)C风格字符串初始化该对象string s(s2); 定义一个新的string对象,并将它初始化为s2的副本string s(cp, n) 创建一个string对象,它被初始化为cp所指向数组的前n个元素的

C++ Primer 5th笔记(9)chapter9 顺序容器 vector 容器的自增长 容器适配器

1. vector 容器的自增长:当插入元素当存储空间不足时,vector 必须重新分配存储空间(比如将新空间大小增加为当前大小的2倍) 管理容量的成员函数 操作定义c.shrink_to_fit()将capacity()减少到和size()相同大小。c.capacity()不重新分配内存空间的话,c可以保存多少个元素c.reverse(n)分配至少能容纳n个元素的内存空间 shrink_t

C++ Primer 5th笔记(9)chapter9 顺序容器 构造和赋值

1. 容器对象的构造和赋值 1.1 构造 C c; C c; //默认构造函数 C c1(c2) C c1=c2; C c{a,b,c,…} C c={a,b,c,…} C c(b,e)//eg. list slist(svec.begin(),svec.end()); C seq(n) // n个值初始化,只适用于顺序容器,必须给出默认构造函数 seq包含n个元素,这些元素进行了值初始化;

C++ Primer 5th笔记(9)chapter9 顺序容器 forward_list

1. 特殊的forward_list 单向链表的删除操作,真正删除的是某个元素后面的值(想想是为什么?) 操作定义lst.before_begin()返回指向链表首元素之前不存在的元素的迭代器,此迭代器不能解引用。lst.cbefore_begin()同上,但是返回的是常量迭代器。lst.insert_after(p, t)在迭代器p之后插入元素。t是一个对象lst.insert_after(

C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象

1. 定义 lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符。 eg. stable_sort(words.begin(),words.end(),[](const string &a,const string &b){return a.size() < b.size();});//等价于下面的类:clas

C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符

1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int operator()(int val) const{return val < 0 ? -val : val;}};int i = -42;absInt absObj;int ui = a

C++ Primer 5th笔记(chap 14 重载运算和类型转换)成员运算符

成员运算符分为两种: 解引用运算符*箭头运算符-> 设计准则 箭头运算符必须是类的成员。解引用运算符通常也是类的成员,尽管并非必须如此。重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象解引用和乘法的区别是一个是一元运算符,一个是二元运算符。 eg. class StrBlobTest {size_type size() const { return data-

C++ Primer 5th笔记(chap 14 重载运算和类型转换)递增和递减运算符

并不要求递增和递减运算符一定是类的成员函数,但是因为这个运算符改变的正好是所操作的对象的状态,所以建议将它们设为成员函数。 为了和内置版本保持一致,前置运算符应该返回递增或递减后对象的引用。 为了和内置版本保持一致,后置运算符应该返回递增或递减前对象的值,而不是引用。 递增和递减运算符应该同时定义前置和后置两个版本。 普通的重载形式无法区分是前置运算还是后置运算,为了解决这个问题,后置版

C++ Primer 5th笔记(chap 14 重载运算和类型转换)下标运算符[]

1. 设计准则 必须定义为成员函数。通常返回访问元素的引用,从而使得下标可以出现在赋值运算符的任意一侧 2. 一般会定义两个版本: 返回普通引用。类的常量成员,并返回常量引用以确保不会给返回的对象赋值。 class StrVec{public:std::string& operator[](std::size_t n){ return elements[n]; }const std::

C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符

运算符双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)关系运算符==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于) 通常情况下,算术和关系运算符应该定义为非成员函数,以便两侧的运算对象进行转换。由于这些运算符一般不会改变运算对象的状态,所以形参都是常量引用。如果类同时定义了算数运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋

C++ Primer 5th笔记(chap 14 重载运算和类型转换)输入和输出运算符

1. 总说明 输入输出运算符必须是非成员函数,否则他们左侧运算对象将是我们的类的一个对象,好比如下代码: Sales_data data;data << cout; 由于IO操作通常需要读写类的非公有数据,所以输入输出运算符一般被声明为友元。输入运算符必须处理输入可能失败的情况,而输出运算符不需要。 2. 输出运算符<< 参数说明: 第一个形参通常是一个非常量的ostream对象的

C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述

1. 定义 重载运算是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号组成。 2. 运算符表 2.1 可重载运算符 运算符类型运算符种类双目算术运算符+ (加),-(减),*(乘),/(除),% (取模)关系运算符==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)逻辑运算符//(逻辑或),&&(逻辑与),!(逻辑非)单

C++ Primer 5th笔记(chap 12 动态内存)shared_ptr

1. 相关概念 1.1 使用场景 • 程序不知道自己需要使用多少对象 • 程序不知道所需对象的准确类型 • 程序需要在多个对象间共享数据 1.2 实现原理 shared_ptr对象有一个关联的计数器,通常称为引用计数。某些操作会递增计数器, 拷贝一个shared_ptr, 例如一个shared_ptr初始化另一个shared_ptr(作为函数参数, 作为函数返回值)某些操作计数器会递减 给

C++ Primer 5th笔记(chap 13 拷贝控制) 实例2内存管理测试结果

1. 测试代码 string temp[] = { "one", "two", "three" };StrVec sv(begin(temp), end(temp));// run the string empty funciton on the first element in svif (!sv[0].empty())sv[0] = "None"; // assign a new v

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用

template < typename T> void f (T &p) 函数参数p是一个模板类型参数T的引用, 编译器会应用正常的引用绑定规则; const 是底层的, 不是顶层的 1.1 从左值引用函数参数推断类型 函数参数的类型 一个普通( 左值) 引用时( 形如 T & ) 绑定规则:传递一个左值( 一个变量或一个返回引用类型的表达式)。实参可以是 const 类型, 也可以不是。

C++ Primer 5th笔记(chap 16 模板和泛型编程)函数模板显式实参

1. 返回类型不清楚的时候,尾置返回允许我们在参数列表之后声明返回类型 template ctypename It> ??? & fcn (It beg, It end) {// 处理序列return *beg; / / 返回序列中一个元素的引用}template ctypename It> auto fen (It beg, It end) -> decltype (*beg){//

C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间

1. using 声明或 using 指示能将某些函数添加到候选函数集 2. 对于接受类类型实参的函数来说, 其名字查找将在实参类所属的命名空间中进行。在这些命名空间中所有与被调用函数同名的函数都将被添加到候选集当中, 即使其中某些函数在调用语句处不可见也是如此 namespace NS {class Quote { / … / };void display (const Quotes) {

C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域

1. 命名空间内部名字的查找规则 由内向外依次查找每个外层作用域。 外层作用域也可能是一个或多个嵌套的命名空间, 直到最外层的全局命名空间查找过程终止。 只有位于开放的块中且在使用点之前声明的名字才被考虑 namespace A {int i;namespace B {int i; // hides A::i within Bint j;int f1(){int j;

C++ Primer 5th笔记(chap 18 大型程序工具)使用命名空间成员

1. 3种方法 using 声明命名空间的别名( namespace alias)using 指示( using directive) 1.1 命名空间的别名 namespace cplusplus_primer { /* ... / ;}namespace primer = cplusplus_primer; 命名空间的別名也可以指向一个嵌套的命名空间: namespace Qli

C++ Primer 5th笔记(chap 19 特殊工具与技术)type_info 类

1. type_info 的操作 操作描述t1 == t2如果type_info对象t1和t2表示同一种类型,则返回truet1 != t2如果type_info对象t1和t2表示不同的类型,则返回truet.name()返回一个C风格字符串,表示类型名字的可打印形式t1.before(t2)返回一个bool值,表示t1是否位于t2之前,顺序关系依赖于编译器 type_info类没有默认构造函

C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

1. 通常情况下使用 typeid 比较两条表达式的类型是否相同或者比较一条表达式的类型是否与指定的类型相同 Derived *dp = new Derived;Base *bp = dp; // 两个指针都指向Derived对象// 在运行时比较两个对象的类型if (typeid(*bp) == type(*dp)) {// bp和dp指向通医药类型对象 } -对数组a执行typ