文章分类 - C++ Primer 读书笔记
<<C++ Primer>>第九章读书笔记
摘要:顺序容器类型 顺序容器 vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列 顺序容器适配器 stack 后进先出(LIFO)堆栈 queue 先进先出(FIFO)队列 priority_queue 有优先级管理的队列 C++ 语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足以下两个约束: 元素类型必须支持赋值运算。 元素类型的对象必须可以复制。 此...
阅读全文
<<C++ Primer>>第八章读书笔记
摘要:IO 对象不可复制或赋值。这个要求有两层特别重要的含义。 正如在第九章看到的,只有支持复制的元素类型可以存储在 vector 或其他容器类型里。由于流对象不能复制,因此不能存储在 vector(或其他)容器中(即不存在存储流对象的 vector 或其他容器)。 第二个含义是:形参或返回类型也不能为流类型。如果需要传递或返回 IO 对象,则必须传递或返回指向该对象的指针或引用: ofstream ...
阅读全文
<<C++ Primer>>第七章读书笔记
摘要:函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针 在定义或声明函数时,没有显式指定返回类型是不合法的: // error: missing return type test(double v1, double v2) { /* ... */ } 早期的 C++ 版本可以接受这样的程序,将 test 函数的返回类型隐式地定义为 int 型。但在标准 C+...
阅读全文
<<C++ Primer>>第六章读书笔记
摘要:在条件表达式中定义的变量必须初始化,该条件检验的就是初始化对象的值。 对于 switch 结构,只能在它的最后一个 case 标号或 default 标号(只有当default是最后一个标号时)后面定义变量。 在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。 形成标号的标识符只能用作 goto 的目标。因为这个原因,标号标识符可以与变量名以及程序里的其他标识符一样,不与别的标识符重名...
阅读全文
<<C++ Primer>>第五章读书笔记
摘要:sizeof格式: sizeof (type name); sizeof (expr); sizeof expr; 使用 sizeof 的结果部分地依赖所涉及的类型: 对 char 类型或值为 char 类型的表达式做 sizeof 操作保证得 1。 对引用类型做 sizeof 操作将返回存放此引用类型对象所需的内在空间大小。 对指针做 sizeof 操作将返回存放指针所需的内在大小;注意,如果要获取该指针所指向对象的大小,则必须对指针进行引用。 对数组做 sizeof 操作等效于将对其元素类型做 sizeof 操作的结果乘上数组元素的个数。 因为 sizeof 返回整个数组在内存中的存储长.
阅读全文
<<C++ Primer>>第四章读书笔记
摘要:数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。 与vector不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组,这些操作都是非法的: int ia[] = {0, 1, 2}; // ok: array of intsint ia2[](ia); // error: cannot initial...
阅读全文
<<C++ Primer>>第三章读书笔记
摘要:有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。理由是头文件的内容会被预处理器复制到程序中。用 #include 包含文件时,相当于头文件中的文本将成为我们编写的文件的一部分。如果在头文件中放置 using 声明,就相当于在包含该头文件 using 的每个程序中都放置了同一 using,不论该程序是否需要 using 声明。 value initialization(值初始化):当给...
阅读全文
<<C++ Primer>>第二章读书笔记
摘要:C++ 标准并未定义 signed 类型如何用位来表示,而是由每个编译器自由决定如何表示 signed 类型。这些表示方式会影响 signed 类型的取值范围。8 位 signed 类型的取值肯定至少是从 -127 到 127,但也有许多实现允许取值从 -128 到 127。 在字符字面值前加 L 就能够得到 wchar_t 类型的宽字符字面值。如: L'a' 正如存在宽字符字面值,如 L'a'...
阅读全文
<<C++ Primer>>第一章读书笔记
摘要:在大多数系统中,main函数的返回值是一个状态指示器。返回值0往往表示main函数成功执行完毕。任何其他非零的返回值都有操作系统定义的含义。通常非零返回值表明有错误出现。每一种操作系统都有自己的方式告诉用户main函数返回什么内容。 访问main函数的返回值的方式和系统有关。不论 UNIX 还是 Windows 系统,执行程序后,必须发出一个适当的echo命令。UNIX 系统中,通过键入如下命令...
阅读全文
<<C++ Primer>> 读书笔记19
摘要:有可能单个catch 不能完全处理一个异常。在进行了一些校正行动之后,catch 可能确定该异常必须由函数调用链中更上层的函数来处理,catch 可以通过重新抛出将异常传递函数调用链中更上层的函数。重新抛出是后面不跟类型或表达式的一个throw: throw;空throw 语句将重新抛出异常对象,它只能出现在 catch 或者从 catch 调用的函数中。如果在处理代码不活动时碰到空 throw,...
阅读全文
<<C++ Primer>> 读书笔记18
摘要:栈展开期间会经常执行析构函数。在执行析构函数的时候,已经引发了异常但还没有处理它。如果在这个过程中析构函数本身抛出新的异常,又会发生什么呢?新的异常应该取代仍未处理的早先的异常吗?应该忽略析构函数中的异常吗?答案是:在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate 函数。一般而言,terminate 函数将调用abort 函数,强制从...
阅读全文
<<C++ Primer>> 读书笔记17
摘要:用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型,指针所指对象的类型就有可能与指针的类型不同。无论对象的实际类型是什么,异常对象的类型都与指针的静态类型相匹配。如果该指针是一个指向派生类对象的基类类型指针,则那个对象将被分割(第 15.3.1 节),只抛出基类部分。如果抛出指针本身,可能会...
阅读全文
<<C++ Primer>> 读书笔记16
摘要:一般而论,不会转换实参以匹配已有的实例化,相反,会产生新的实例。除了产生新的实例化之外,编译器只会执行两种转换:const 转换:接受 const 引用或 const 指针的函数可以分别用非 const 对象的引用或指针来调用,无须产生新的实例化。如果函数接受非引用类型,形参类型实参都忽略 const,即,无论传递 const 或非 const 对象给接受非引用类型的函数,都使用相同的实例化。数组...
阅读全文
<<C++ Primer>> 读书笔记 15
摘要:除了定义数据成员或函数成员之外,类还可以定义类型成员。例如,标准库的容器类定义了不同的类型,如size_type,使我们能够以独立于机器的方式使用容器。如果要在函数模板内部使用这样的类型,必须告诉编译器我们正在使用的名字指的是一个类型。必须显式地这样做,因为编译器(以及程序的读者)不能通过检查得知,由类型形参定义的名字何时是一个类型何时是一个值。例如,考虑下面的函数:template <cl...
阅读全文
<<C++ Primer>> 读书笔记 14
摘要:名字查找在编译时发生。对象、引用或指针的静态类型决定了对象能够完成的行为。甚至当静态类型和动态类型可能不同的时候,就像使用基类类型的引用或指针时可能会发生的,静态类型仍然决定着可以使用什么成员。 回忆一下,局部作用域中声明的函数不会重载全局作用域中定义的函数,同样,派生类中定义的函数也不重载基类中定义的成员。通过派生类对象调用函数时,实参必须与派生类中定义的版本相匹配,只有在派生类根本没有定义该...
阅读全文
浙公网安备 33010602011771号