随笔分类 - 《C++ Primer》系列笔记
C++ Primer笔记整理
    
摘要:OOP概述 面向对象程序设计的核心思想是数据抽象、继承和动态绑定。 通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类,其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。 在C++语言中,
        阅读全文
                
摘要:拷贝控制概念 拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时做什么。我们称这些操作为拷贝控制操作。 拷贝、赋值与销毁 拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用
        阅读全文
                
摘要:定义抽象数据类型 定义成员函数 成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部。作为接口组成部分的非成员函数,它们的定义和声明都在类的外部。 定义在类内部的函数是隐式的inline函数。 引入this 成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。当我
        阅读全文
                
摘要:tuple类型 tuple支持的操作 解释 tuple<T1, T2, ..., Tn> t; t是一个tuple,成员数为n,第i个成员的类型为Ti。所有成员都进行值初始化 tuple<T1, T2, ..., Tn> t(v1, v2, ..., vn); t是一个tuple,成员类型为T1..
        阅读全文
                
摘要:控制内存分配 应用程序可以在全局作用域中定义operator new函数和operator delete函数,也可以将它们定义为成员函数。当编译器发现一条new表达式或delete表达式后,将在程序中查找可供调用的operator函数。 如果被分配(释放)的对象是类类型,则编译器首先在类及其基类的作
        阅读全文
                
摘要:异常处理 栈展开过程沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch子句为止:或者也可能一直没找到匹配的catch,则退出主函数后查找过程终止。 当执行完catch子句后,找到与try块关联的最后一个catch子句之后的点,并从这里继续执行。 一个异常如果没有被捕获,则它将终止当前的程
        阅读全文
                
摘要:一个函数模板就是一个公式,可用来生成针对特定类型的函数版本。 模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。 在模板定义中,模板参数列表不能为空。 模板参数表示在类或函数定义中用到的类型或值。当使用模板时
        阅读全文
                
摘要:当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。一元运算
        阅读全文
                
摘要:shared_ptr和unique_ptr都支持的操作 解释 shared_ptr sp或unique_ptr up 空智能指针,可以指向类型为T的对象 p 将p用作一个条件判断,若p指向一个对象,则为true *p 解引用p,获得它指向的对象 p->mem 等价于(*p).mem p.get() 
        阅读全文
                
摘要:关联容器类型 解释 按关键字有序保存元素 —— map 关联数组;保存关键字-值对 set 关键字即值,即只保存关键字的容器 multimap 关键字可重复出现的map multiset 关键字可重复出现的set 无序集合 —— unordered_map 用哈希函数组织的map unordered
        阅读全文
                
摘要:迭代器令算法不依赖于容器,但算法依赖于元素类型的操作。 算法永远不会执行容器的操作。算法永远不会改变底层容器的大小。 accumulate定义在头文件numeric中,接受三个参数,前两个指出需要求和的元素的范围,第三个参数是和的初值。accumulate的第三个参数的类型决定了函数中使用哪个加法运
        阅读全文
                
摘要:顺序容器类型 | 类型 | 解释 | | | | | vector | 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 | | deque | 双端队列。支持快速随机访问。在头尾位置插入、删除速度很快 | | list | 双向链表。只支持双向顺序访问。在list中任何位置进
        阅读全文
                
摘要:iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。 由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以
        阅读全文
                
摘要:任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字(形参就相当于该函数的局部变量)。 形参名是可选的,但是由于我们无法使用未命名的形参,所以形参一般都应该有个名字。某类形参通常不命名以表示在函数体内不会使用它。不管怎样,是否设置未命名的形参并不影响调用时提供的实参
        阅读全文
                
摘要:空块的作用等价于空语句。 case标签必须是整型常量表达式,default也是一种特殊的case标签。 标签不应该孤零零地出现,它后面必须跟上一条语句或者另外一个case标签。 如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。不允许跨
        阅读全文
                
摘要:C++的表达式要不然是右值(right-value or read-value),要不然就是左值(left-value or location-value)。 当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。 需要右值的地方可以用左值来
        阅读全文
                
摘要:位于头文件的代码一般来说不应该使用using声明。 如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化。 string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始
        阅读全文
                
摘要:基本内置类型 如何选择算术类型 如果你的数值超过了int表示范围,选用long long 如果你需要使用一个不大的整数,那么明确指定它的类型是signed char或者unsigned char 执行浮点数运算选用double 含有无符号类型的表达式 当一个算术表达式中既有无符号数又有int值时,那
        阅读全文
                
摘要:向流写入数据 输出运算符<< 的计算结果就是其左侧运算对象 std::endl 结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。 程序员常常在调试时添加打印语句。这类语句应该保证“一直”刷新流。 从流读取数据 输入运算符>> 返回其左侧侧运算对象作为其运算结果。 C++注释 注释界定符不能嵌套
        阅读全文
                

浙公网安备 33010602011771号