
《c++ primer》笔记
《c++ primer》5th 笔记
thefist11
难以忘记编程路上领导和好友的细致指导,所以必须努力!(真诚希望大家多多指导!)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承
1. 继承体系中的每个类都可能在某个时刻成为“ 最低层的派生类”。 只要我们能创建虚基类的派生类对象, 该派生类的构造函数就必须初始化它的虚基类。Bear::Bear (std::string name, bool onExhibit): ZooAnimal (name, onExhibit, "Bear”) { }Raccoon::Raccoon (std::string name, bool onExhibit ) ZooAnimal (name, onExhibit, "Raccoon原创 2021-12-03 07:44:25 · 610 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)多重继承下的类作用域
1. 派生类的作用域嵌套在直接基类和间接基类的作用域中。 查找过程沿着继承体系自底向上进行, 直到找到所需的名字。派生类的名字将隐藏基类的同名成员。在多重继承的情况下, 相同的查找过程在所有直接基类中同时进行。 如果名字在多个基类中都被找到, 则对该名字的使用将具有二义性注:python不是这样的,python是按照父类顺序,找到一个就好1.1 解决方法在派生类中为该函数定义一个新版本。eg. 为 Panda 定义一个 max_weight 函数从而解决二义性问题:double Panda::原创 2021-12-02 07:54:05 · 578 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)虚继承
1. 问题派生类可以多次继承同一个类。 派生类可以通过它的两个直接基类分别继承同一个间接基类, 也可以直接继承某个基类, 然后通过另一个基类再一次间接继承该类。如果某个类在派生过程中出现了多次, 则派生类中将包含该类的多个子对象。2. 虚基类virtual inheritance虚继承的目的是令某个类做出声明,承诺愿意共享它的基类。其中共享的基类子对象被称为虚基类,不论虚基类在继承体系下被继承多少次,在派生类中都只包含唯一一个共享的虚基类子对象(菱形继承)。2.1 使用方式指定虚基类的方式是在派生原创 2021-12-02 07:51:14 · 503 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)类型转换与多个基类
1. 在只有一个基类的情况下, 派生类的指针或引用能自动转换成一个可访问基类的指针或引用。 我们可以令某个可访问基类的指针或引用直接指向一个派生类对象。eg. 一个ZooAnimal、 Bear 或 Endangered 类型的指针或引用可以绑定到 Panda 对象上/ / 接受 Panda 的基类引用的一系列操作void print(const Bears);void highlight(const Endangered& );ostream& operator <<原创 2021-12-01 07:57:48 · 175 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承之构造函数、析构函数
1. 继承的构造函数与多重继承如果从多个基类中继承了相同的构造函数(即形参列表完全相同),则程序将产生错误struct Basel { Basel () = default; Basel (const std::strings); Basel (std::shared_ptr<int>);};struct Base2 { Base2() = default; Base2(const std::strings); Base2(int) ;};// 错误原创 2021-11-30 07:38:00 · 224 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承与虚继承
1. 多重继承 (multiple inheritance)一个类从多个直接基类派生eg.class Bear : public ZooAnimal {class Panda : public Bear, public Endangered { /* ... */ };Panda对象内存1.1 构造一个派生类的对象将N时构造并初始化它的所有基类子对象。 与从一个基类进行的派生一样, 多重继承的派生类的构造函数初始值也只能初始化它的直接基类1.2 派生类的构造函数初始值列表将实参分别传递给每原创 2021-11-21 09:42:25 · 382 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid
1. 通常情况下使用 typeid 比较两条表达式的类型是否相同或者比较一条表达式的类型是否与指定的类型相同Derived *dp = new Derived;Base *bp = dp; // 两个指针都指向Derived对象 // 在运行时比较两个对象的类型if (typeid(*bp) == type(*dp)) { // bp和dp指向通医药类型对象 }-对数组a执行typeid(a)。所得的结果是数组类型而非指针类型。1.1 typeid作用于对象,因此我们使用*bp原创 2021-10-28 06:20:33 · 166 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数
void *operator new (size_t size) { if (void *mem = malloc (size) ) return mem; else throw bad_alloc ( );}void operator delete (void *mem) noexcept { free (mem); }原创 2021-10-28 05:56:21 · 152 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)局部类
1. 局部类 ( local class)局部类的所有成员( 包括函数在内 ) 都必须完整定义在类的内部。 因此, 局部类的作用与嵌套类相比相差很远在局部类中不允许声明静态数据成员局部类不能使用函数作用域中的变量局部类只能访问外层作用于定义的类型名、静态变量以及枚举成员。如果局部类定义在某个函数内部, 则该函数的普通局部变量不能被该局部类使用int a, val;void foo(int val){ static int si; enum Loc { a = 1024,原创 2021-10-18 07:28:05 · 153 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符
1. typeid运算符(typeid operator)它允许程序向表达式提问:你的对象是什么类型?typeid表达式的形式是typeid(e),其中e可以是任意表达式或类型的名字,它操作的结果是一个常量对象的引用。它可以作用于任意类型的表达式。1.1 通常情况下,使用typeid比较两条表达式的类型是否相同,或者比较一条表达式的类型是否与指定类型相同:Derived *dp = new Derived;Base *bp = dp;if (typeid(*bp) == typeid(*dp原创 2021-10-28 06:46:46 · 185 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI
1. 运行时类型识别(run-time type identification )当我们将这两个运算符用于某种类型的指针或引用, 并且该类型含有虚函数时, 运算符将使用指针或引用所绑定对象的动态类型typeid 运算符, 用于返回表达式的类型。dynamic_cast 运算符, 用于将基类的指针或引用安全地转换成派生类的指针或引用2 dynamic_cast运算符 :type类型必须时一个类类型,并且通常情况下该类型应该含有虚函数。dynamic_cast<type*>(e)原创 2021-10-28 06:44:40 · 147 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次
1.类 exception 、 bad_cast 和 bad_alloc 定 义 了 默 认 构 造 函 数runtime_error 和 logic_error没有默认构造函数, 但是有一个可以接受 C 风格字符串或者标准库 string类型实参的构造函数1.1 exception 定义的函数拷贝构造函数拷贝赋值运算符一个虚析构函数一个名为 what 的虚成员。what 函数返回一个 const char*,该指针指向一个以null结尾的字符数组, 并且确保不会抛出任何异常eg原创 2021-10-29 06:26:53 · 118 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI
1. RTTI用处当想为具有继承关系的类实现相等运算符时。对于两个对象来说,如果他们的类型相同并且对应的数据成员取值相同,则我们说这两个类是相等的。class Base { friend bool operator==(const Base&, const Base&); public: // Base的接口成员 protected: virtual bool equal(const Base&) const; // Base的原创 2021-10-28 06:11:51 · 283 阅读 · 0 评论 -
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类没有默认构造函数它的拷贝和移动构造函数以及赋值运算符都被定义为删除的。无法定原创 2021-10-28 06:30:18 · 188 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)嵌套类
1. 嵌套类( nested class)或嵌套类型( nested type )一个类可以定义在另一个类的内部,这个类常用于定义作为实现部分的类。class TextQuery {public: class QueryResult; // 嵌套类稍后定义}// QueryResult是TextQuery的成员class TextQuery::QueryResult { // 位于类的作用域内, 因此我们不必对QueryResult形参进行限定 friend std原创 2021-10-18 07:25:37 · 333 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)枚举类型
1. 枚举类型(enumeration)将一组整型常量组织在一起。1.1 限定作用域 的 枚 举 类 型( scoped enumeration)关 键 字 enum class ( enum struct)枚举成员列表( enumerator)eg.enum class open_modes{ input, output, append};1.2 不限定作用域的枚举类型( unscoped enumeration)省略掉关键字 classeg. enum原创 2021-10-11 06:40:44 · 219 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针
1. 成员指针( pointer to member)指可以指向类的非静态成员的指针。成员指针指示的是类的成员, 而非类的对象。类的静态成员不属于任何对象, 因此无须特殊的指向静态成员的指针指向静态成员的指针与普通指针没有什么区别。成员指针的类型囊括了类的类型以及成员的类型。 当初始化一个这样的指针时, 我们令其指向类的某个成员, 但是不指定该成员所属的对象;class Screen {public: typedef std::string::size_type pos;原创 2021-10-13 00:03:02 · 128 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)链接指示: extern “C“
1. C++程序有时需要调用其他语言编写的函数, C++使用链接指示( linkage directive)指出任意非 C++函数所用的语言1.1 声明一个非C++函数// 可能出现在 C++头文件<cstring>中的链接指示// 单语句链接指示extern "C" size_t strlen(const char *);// 复合语句链接指示extern "C" { int strcmp(const char*, const char*); char *str原创 2021-10-25 08:16:32 · 224 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式
1. 定位 new (placement new)1.1 起因内存分配和初始化分离开Placement new allows you to construct an object in memory that’s already allocated.C++早期版本中,allocator类还不是标准库一部分。应用程序调用operator new和operator delete。这两个函数的负责分配或释放内存空间,但是不会构造或销毁对象。1.2 解决对于operator new分配的内存空间,用n原创 2021-10-28 06:08:00 · 244 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“位域”
两种不可移植的特性: 位域和 volatile1. 位域 ( bit-field )类可以将其( 非静态) 数据成员定义成位域 , 在一个位域中含有一定数量的二进制位。位域的类型必须是整型或枚举类型位域在内存中的布局是与机器相关的typedef unsigned int Bit;class File { Bit mode: 2; Bit modified: 1; Bit prot_owner: 3; Bit prot_group: 3; Bit pro原创 2021-10-23 00:08:15 · 165 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)union
1. 定义联合( union) 是一种特殊的类。 一个 union 可以有多个数据成员, 但是在任意时刻的某个成员赋值之后, 该 union 的其他成员就变成未定义的状态了。对象的存储空间至少要能容纳它的最大的只有一个数据成员可以有值。union 既不能继承自其他类, 也不能作为基类使用可用来表示一组类型不同的互斥值// Token 类型的对象只有一个成员, 该成员的类型可能是下列类型中的任意一种union Token { // 默认情况下成员是公有的 char cval; int i原创 2021-10-18 07:21:43 · 342 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针
1.使用 classname::*的形式声明一个指向成员函数的指针。eg./ / pmf 是一个指针, 它可以指向 Screen 的某个常量成员函数/ / 前提是该函数不接受任何实参, 并且返回一个 charauto pmf = &Screen::get_cursor;指向成员函数的指针也需要指定目标函数的返回类型和形参列表如果成员函数是 const 成员 或者引用成员, 则我们必须将 const 限定符或引用限定符包含进来。如果成员存在重载的问题, 则我们必须显式地声明函数类原创 2021-10-14 21:14:05 · 123 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”
1. volatile 限定符当对象的值可能在程序的控制或检测之外被改变时, 应该将该对象声明为 volatilevolatile int display_register; //display_register是一个int型的volatile对象 volatile Task *curr_task; //curr_task是一个指向volatile的Task类对象的指针volatile int ixa[ max_size ]; //ixa是一个volatile的整型数组,数组的每个元素都原创 2021-10-23 23:43:46 · 176 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象
1. 通过一个指向成员函数的指针进行函数调用利用.*或者->*运算符将该指针绑定到特定的对象上。与普通的函数指针不同,成员指针不是一个可调用对象不支持函数调用运算符。不能直接将一个指向成员函数的指针传递给算法auto fp = &string::empty; // fp指向string的empty函数// 错误, 必须使用.*或者->*调用成员指针find_if(svec.begin(), svec.end(), fp);-> // 在find_if内原创 2021-10-16 14:29:12 · 148 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配
void operator new (size_t, void ) ;//不允许重新定义这个版本1. newstring *sp = new string("a value"); //分配并初始化一个string对象string *arr = new string[10]; // 分配10个默认初始化的string对象1.1 工作原理执行了三步操作:step1. new表达式调用一个名为operator new(或operator new [])的标准库函数,它分配一块足够大的、原始的、未原创 2021-10-27 07:53:52 · 131 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间
1. using 声明或 using 指示能将某些函数添加到候选函数集2.对于接受类类型实参的函数来说, 其名字查找将在实参类所属的命名空间中进行。在这些命名空间中所有与被调用函数同名的函数都将被添加到候选集当中, 即使其中某些函数在调用语句处不可见也是如此namespace NS { class Quote { / … / }; void display (const Quotes) { / . .. */ }}//Bulk_item 的基类声明在命名空间 NS 中class Bulk_原创 2021-11-02 06:50:04 · 160 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域
1. 命名空间内部名字的查找规则由内向外依次查找每个外层作用域。外层作用域也可能是一个或多个嵌套的命名空间, 直到最外层的全局命名空间查找过程终止。只有位于开放的块中且在使用点之前声明的名字才被考虑 namespace A { int i; namespace B { int i; // hides A::i within B int j; int f1()原创 2021-11-02 06:43:59 · 152 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具) using指示
1. 定义using指示以关键字using开始,后面是关键字namespace以及命名空间的名字1.1 vs using声明无法控制那些名字是可见的,因为所有名字都是可见的using 声明, 我们只是简单地令名字在局部作用域内有效。using指示, 整个命名空间的所有内容变得有效。通常情况下, 命名空间中会含有一些不能出现在局部作用域中的定义, 因此, using 指示一般被看作是出现在最近的外层作用域中1.2 作用域using指示可以出现在全局作用域、局部作用域和命名空间作用域中,但是原创 2021-11-02 06:32:05 · 183 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)使用命名空间成员
1. 3种方法. using 声明. 命名空间的别名( namespace alias). using 指示( using directive)1.1 命名空间的别名namespace cplusplus_primer { /* ... / ;}namespace primer = cplusplus_primer;命名空间的別名也可以指向一个嵌套的命名空间:namespace Qlib = primer::QueryLib;Qlib::Query q;一个命名空间可以有好几个同义原创 2021-11-01 23:53:03 · 148 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)未命名的命名空间unnamed namespace
1. 定义关键字 namespace 后紧跟花括号括起来的一系列声明语句1.1 生命周期未命名的命名空间中定义的变量拥有静态生命周期: 它们在第一次使用前创建, 并且直到程序结束才销毁未命名的命名空间取代文件中的static 静态声明1.2 多个文件每个文件定义自己的未命名的命名空间,如果两个文件都含有未命名的命名空间,则这两个空间互相无关。在这两个未命名的命名空间里面可以定义相同的名字,并且这些定义表示的是不同实体。如果一个头文件定义了未命名的命名空间,则该命名空间中定义的名字将原创 2021-11-01 08:15:09 · 761 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)内联命名空间 (inline namespace)
1. inline必须出现在命名空间第一次出现的地方inline namespace FifthEd { //...}//后续再打开命名空间的时候可以写inline也可以不写namespace FifthEd { // 隐式内敛 // ...}2. 当应用程序的代码在一次发布和另一次发布之间发生改变时,常使用内联命名空间。eg. 把本书当前版本的所有代码放在一个内联命名空间中,而之前版本的代码都放在一个非内联命名空间中namespace FourthEd { c原创 2021-11-01 08:08:54 · 182 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性
1. 命名空间成员定义在命名空间中的实体称为命名空间成员。在命名空间中定义的名字能够被命名空间中的其它成员直接訪问,命名空间外部的代码必须指出名字定义在哪个命名空间中命名空间中定义的成员可以直接使用名字, 此时无须前缀在命名空间定义的外部定义该命名空间的成员命名空间之外定义的成员必须使用含有前缀的名字eg. 可以在 cplusplusprimer 或全局作用域中定义 Sales_data operator+, 但是不能在一个不相关的作用域中定义这个运算符。#include "Sales_d原创 2021-11-01 08:04:45 · 124 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)命名空间
1. 问题:命名空间污染 namespace pollution多个库将名字放置在全局命名空间1.1 一般人的解决方法起长名字eg.class cplusplus_primer_Query {...}string cplusplus_primer_make_plural (size_t, strings&);2. 命名空间namespace分割了全局命名空间, 其中每个命名空间是一个作用域。 通过在某个命名空间中定义库的名字, 库的作者( 以及用户) 可以避免全局名字固有的限原创 2021-10-30 22:31:49 · 152 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)异常处理
1. 异常处理 ( exception handling)允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。异常使得我们能够将问题的检测与解决过程分离开来。 程序的一部分负责检测问题的出现, 然后解决该问题的任务传递给程序的另一部分1.1 栈展开( stack unwinding)当抛出一个异常后, 程序暂停当前函数的执行过程并立即开始寻找与异常匹配的catch 子句。 当 throw 出现在一个 try 语句块( try block) 内时, 检查与该 try 块关联的 c原创 2021-10-26 05:27:59 · 174 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)noexcept
1. 通过提供 noexcept 说明 ( noexcept specification ) 指定某个函数不会抛出异常。 其形式是关键字 noexcept 紧跟在函数的参数列表后面{ // 紧跟在函数的参数列表后面 // 该说明应该在函数的尾置返回类型之前 // 在成员函数中,noexcept说明符应该出现在const以及引用限定之后 // 而在final,override,或者虚函数的=0之前。 void recoup(int) noexcept;//不会抛出异常原创 2021-10-26 05:41:24 · 1012 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常
1. catch 子句 (catch clause) 中的异常声明(exception declaration)声明的类型决定了处理代码所能捕获的异常类型。这个类型必须是完全类型, 它可以是左值引用, 但不能是右值引用1.1 catch 的参数类型可以是引用类型或非引用类型如果 catch 的参数是基类类型, 则我们可以使用其派生类类型的异常对象对其进行初始化。 此时, 如果 catch 的参数是非引用类型, 则异常对象将被切掉一部分异常声明的静态类型将决定 catch 语句所能执行的操作。如果原创 2021-10-26 05:33:59 · 339 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 18 大型程序工具)函数 try 语句块与构造函数
1. 问题构造函数在进入函数体之前首先执行初始化列表。因为在初始值列表抛出异常时构造函数体内的try语句块还未生效1.1 解决方法{ // 这是处理构造函数初始值错误的唯一方法 template <typename T> Blob<T>::Blob(initializer_list<T> il) try : data(make_shared<vector<T>>(il)) {原创 2021-10-26 05:35:18 · 207 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数
1. 场景: rand 生成随机数此函数生成均匀分布的伪随机整数, 每个随机数的范围在 0 和一个系统相关的最大值( 至少为 32767) 之间。1.1 问题:一些应用需要随机浮点数。一些程序需要非均匀分布的数。2. 解决方法:随机数库随机数库的组成随机数引擎类( random-number engines)生成随机 unsigned 整数序列随机数分布类(random-number distribution)使用引擎返回服从特定概率分布的随机数2.1 随机数引擎和分布随机数原创 2021-11-05 06:55:39 · 446 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数引擎 vs rand 函数
1. 结果范围随机数引擎:生成的 unsigned 整数在一个系统定义的范围内rand 生成的数的范围:在 0 到 RAND_MAX 之间eg. 一个引擎类型的范围可以通过调用该类型对象的 min 和 max 成员来获得:cout << "min: " << e.min ( ) << " max: " << e.max () << endl;输出min: 1 max: 21474836461.1 引擎生成一个数值序列原创 2021-11-08 07:33:29 · 194 阅读 · 0 评论 -
C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作
1. 多字节操作一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组操作解释is.get(sink, size, delim)从is中读取最多size个字节,并保存在字符数组中,字符数组的起始地址由sink给出。读取过程直到遇到字符delim或读取了size个字节或遇到文件尾时停止。如果遇到了delim,则将其留在输入流中,不读取出来存入sink。is.getline(sink, size, delim)与接收三个参数的get原创 2021-11-17 08:10:54 · 378 阅读 · 0 评论