摘要:
一、概述 尽量少用预处理器——宏替换 二、细节 1. 关于宏替换之常量 旧版本:#define N 10; 新版本:const int n = 10; 比较:#define不被视为语言的一部分,记号名称N在编译器开始处理源代码之前就被预处理器移走了。 补充:class的专属常量需要封装性,而#def 阅读全文
摘要:
一、关键点 转换构造函数:传送门之explicit构造函数 类类型转换运算符 二、转换构造函数——隐式的类类型转换 转换构造函数:该构造函数只接受一个实参,它实际定义了从构造函数的参数类型向类类型隐式转换的规则 重点是:如何使用该条规则 上面“book3 = isbn;”语句包含string类型向S 阅读全文
摘要:
前言 关联容器并不值得写一篇讲解的文章,它只是部分细节需要熟能生巧。 一、关键点 向map、set中添加元素 使用map、set 关联容器的元素类型 二、关联容器支持的类型别名 对于set,与key_type相同 对于map,为pair<const key_type, mapped_type> 使用 阅读全文
摘要:
一、指令是什么 我们通过学习《计算机是怎么工作的》,知道计算机的工作核心是——取指执行,所以指令的重要性不言而喻。 指令:通知CPU执行某种操作的“命令”,如AX+BX→AX指令就是让CPU将AX寄存器和BX寄存器中的数相加,并将结果放入AX寄存器中。 所以,指令是CPU操作的基本单位,而计算机程序 阅读全文
摘要:
CPU 微处理器的性能指标的体现:字长、主频 字长:指CPU能同时处理的数据位数,也称为数据宽度 主频:CPU的时钟频率 总线 3条总线:地址总线、数据总线、控制总线 每一条总线都有若干根 地址总线:传输地址信息,用来寻址存储单元和I/O端口,其宽度决定了系统内存的最大容量,如32根地址线可寻址4G 阅读全文
摘要:
第一章 开始 类型:程序所处理的数据都保存在变量中,而每个变量都有自己的类型 内置类型:语言自身定义的类型(而形如string等类型都是标准库定义的) main的返回值:0表示成功,非0指出错误类型 从命令行运行编译器 for语句 术语表:缓冲区、cerr、clog、表达式 第一部分 C++基础 第 阅读全文
摘要:
何时使用:使用存在继承关系的类型时,必须将一个变量或其他表达式的静态类型与该表达式表示对象的动态类型区分开来 静态类型:表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型 动态类型:动态类型直到运行时才可知,(变量或)表达式表示的内存中的对象的类型 如果表达式既不是引用也不是 阅读全文
摘要:
一、关键点 虚函数:某些成员函数,基类希望它的派生类各自定义适合自身的版本 任何构造函数之外的非static函数都可以是虚函数 关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义 一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数 派生类必须在其内部对所有重新定义的虚 阅读全文
摘要:
一、拷贝控制操作之于类 作用:定义类对象拷贝、移动、赋值或销毁时做什么 没有定义:编译器会为我们定义,但合成版本的行为可能并非我们所想 二、拷贝构造函数 1. 每个成员的类型决定了它如何拷贝 类类型的成员,会使用其拷贝构造函数来拷贝;内置类型的成员则直接拷贝。 对于数组,合成拷贝构造函数会逐元素地拷 阅读全文
摘要:
一、谓词&向算法传递函数 1. 某些算法其中一个参数可以是谓词 2. 谓词:一个可调用的表达式,其返回结果是一个能用作条件的值 如函数cmp就是一个谓词(返回能作为条件的bool值,能调用cmp(a, b)) 接受谓词参数的算法对输入序列中的元素调用谓词,如cmp(vec.begin(), vec. 阅读全文
摘要:
一、关键点 0. 枚举类型&&枚举成员&&枚举值 枚举类型:enum类型,如color就是一个枚举类型,我们可以定义color类型的对象(color flower = red;) 枚举成员:red、blue、yellow都是枚举成员,它们是整型const的,即它们本身就是常量表达式,而初始化它们也需 阅读全文
摘要:
19.1 19.2 allocator类将使用我们自定义的版本替换标准库定义的版本,来获取/释放存储空间。 19.3 (a):失败,pa指向派生类C,而B是C的基类,故无法转换 (b):成功 (c):失败,同(a) 其他人的答案: (a):正确,pa指向C构造的对象的A部分 (b):失败,pb指向的 阅读全文
摘要:
18.1 异常对象的类型: (a):range_error (b):range_error throw p将抛出一个exception类型的异常 18.2 分配的动态内存将无法释放 答案:发生异常,所在块之前的临时变量皆会被销毁,V会调用vector类的析构函数进行销毁,并释放相关内存,P指针会被销 阅读全文
摘要:
17.1 17.2 17.4 17.5 17.6 17.7 倾向于书中的版本,更简洁、灵活 17.8 创建的是使用Sales_data默认构造函数创建的对象 这样的结果就是书名为空,其他数据为0 17.9 (a):后六位为100000,前面58位全为0 (b):后七位为1010101,前面25位全为 阅读全文
摘要:
16.1 知识点:当我们调用一个模板函数时,即向一个模板传递实参,编译器用此函数实参来推断模板实参,并将该模板实参(即实参的类型)绑定到模板参数(即T)。 实例化:编译器用模板实参代替对应的模板参数来创建出一个新“实例”。譬如用int代替T,创建出一个新函数实例。 16.2 16.4 16.5 16 阅读全文
摘要:
一、解引用 谈到箭头运算符,就离不开指针 我们知道指针不是重点,重点是指针指向的对象,我们可以通过指针来获得指针指向的对象 获得指针指向的对象 == 解引用 方式一:箭头运算符(假设p是一个指针) p->:代表p指向的对象 方式二:解引用运算符 *p:代表p指向的对象 二、更多 我们知道*p后常常跟 阅读全文
摘要:
工作也快两年了,偶然看到自己以前写过的一些技术博客,发现自己自毕业后一直没有更新过自己的技术博客,趁现在是刚过完春节快要回公司工作之际,谈谈我个人对后台开发的一些个人见解,希望能够对在校的学生或者刚刚接触C++后台开发的童鞋有点帮助。 还记得自己在学校的时候,一直都比较注重的是:编程语言+数据结构与 阅读全文
摘要:
一、protected成员 1. 受保护的成员的可访问性 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它。 派生类的成员及其友元不能访问其基类对象的受保护成员,它们只能访问继承到派生类对象中的受保护成员 派生类的成员及其友元只能访问 阅读全文
摘要:
15.1 虚函数:基类的成员函数,并在其前面添加关键字virtual,此类函数是基类希望其派生类进行覆盖的函数 15.2 protected:对应受保护成员,派生类可以访问该成员,但其他用户则禁止访问该成员 15.3 1 class Quote { 2 public: 3 Quote() = def 阅读全文
摘要:
14.1 不同点:重载运算符至少有一个操作数是类类型,而且对于部分运算符它无法保留求值顺序或短路求值属性 相同点:对于一个重载运算符来说,其优先级和结合律与对应的内置运算符保持一致 14.2 1 #include <iostream> 2 #include <vector> 3 #include < 阅读全文
摘要:
1. 类怎么变为聚合类 所有成员是public的 没有定义构造函数 没有类内初始值 没有基类和virtual函数 2. 特点 可以显式地初始化类的对象的成员 用户可以直接访问其成员 阅读全文
摘要:
前面是扫盲部分,可直接看后面的精华部分。 /* 扫盲 一、隐式的类类型转换 1. 转换构造函数 如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制 能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则 2. 从参数类型向类类型隐式转换的实例 【从is 阅读全文
摘要:
一、动态数组 【new的局限性】 new将内存分配和对象构造组合在一起,同样delete将对象析构和内存释放组合在一起 我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起(我们知道对象应有什么值),但分配一大块内存时,我们往往计划在这块内存上按需构造对象→将内存分配和对象构造分离,即我们可 阅读全文
摘要:
一、运算符new 1. 使用new动态分配对象 在自由空间分配的内存是无名的,故new无法为其分配的对象命名,而是返回一个指向该对象的指针 int *pi = new int; //pi指向一个动态分配的、未初始化的无名对象 表达式“new int”:①在自由空间构造一个 int 型对象;②返回指向 阅读全文
摘要:
一、智能指针类型&智能指针 1. 标准库提供了两种智能指针类型(来管理动态分配的对象) 2. 智能指针 智能指针就是一个变量、一个对象,即智能指针类型的实例化(比如在整型 int 和变量 i 中,智能指针就类似 i) 3. 智能指针与指针 智能指针的行为类似常规指针 区别:智能指针负责自动释放所指向 阅读全文