文章分类 - C++
<<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
摘要:名字查找在编译时发生。对象、引用或指针的静态类型决定了对象能够完成的行为。甚至当静态类型和动态类型可能不同的时候,就像使用基类类型的引用或指针时可能会发生的,静态类型仍然决定着可以使用什么成员。 回忆一下,局部作用域中声明的函数不会重载全局作用域中定义的函数,同样,派生类中定义的函数也不重载基类中定义的成员。通过派生类对象调用函数时,实参必须与派生类中定义的版本相匹配,只有在派生类根本没有定义该...
阅读全文
<<C++ Primer>> 读书笔记 13
摘要:构造函数初始化列表为类的基类和成员提供初始值,它并不指定初始化的执行次序。首先初始化基类,然后根据声明次序初始化派生类的成员。 析构函数的工作与复制构造函数和赋值操作符不同:派生类析构函数不负责撤销基类对象的成员。编译器总是显式调用派生类对象基类部分的析构函数。每个析构函数只负责清除自己的成员。对象的撤销顺序与构造顺序相反:首先运行派生析构函数,然后按继承层次依次向上调用各基类析构函数。 如果...
阅读全文
<<C++ Primer>> 读书笔记 12
摘要:C++ 中的函数调用默认不使用动态绑定。要触发动态绑定,满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不进行动态绑定;第二,必须通过基类类型的引用或指针进行函数调用。 在某些情况下,希望覆盖虚函数机制并强制函数调用使用虚函数的特定版本,这里可以使用作用域操作符:这段代码强制将 net_price 调用确定为 Item_base 中定义的版本,该调...
阅读全文
<<C++ Primer>> 读书笔记 11
摘要:在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。 派生类只能通过派生类对象访问其基类的 protected 成员,派生类对其基类类型对象的 protected 成员没有特殊访问权限。 例如,假定 Bulk...
阅读全文
<<C++ Primer>> 读书笔记 10
摘要:C++ 语言不要求自增操作符或自减操作符一定作为类的成员,但是,因为这些操作符改变操作对象的状态,所以更倾向于将它们作为成员。 为了与内置类型一致,前缀式操作符应返回被增量或减量对象的引用。 同时定义前缀式操作符和后缀式操作符存在一个问题:它们的形参数目和类型相同,普通重载不能区别所定义的前缀式操作符还是后缀式操作符。为了解决这一问题,后缀式操作符函数接受一个额外的(即,无用的)int 型形参...
阅读全文
<<C++ Primer>> 读书笔记 9
摘要:为了与 IO 标准库一致,操作符应接受 ostream& 作为第一个形参,对类类型 const 对象的引用作为第二个形参,并返回对 ostream 形参的引用。 一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,它们不应该输出换行符。 与输出操作符类似,输入操作符的第一个形参是一个引用,指向它要读的流,并且返回的也是对同一个流的引用。它的第二个形参是对要读入的对象的非 con...
阅读全文
浙公网安备 33010602011771号