0%

标准库类型String

读写string对象

1
2
3
string s;
cin >> s; //from empty to empty
getline(cin,s); //one line, stop by ENTER

当把string对象和字符(串)字面值混在一条语句时,必须确保加法运算符(+)两侧的运算对象至少一个是string

标准库类型vector

vector是模板而非类型

1
2
3
4
5
vector<T> v1;
vector<T> v2(v1);
vector<T> v3 = v1; //same to above
vector<T> v4{a,b,c,...};
vector<T> v5 = {a,b,c,...}; //same to above

凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素

数组

理解复杂的数组声明(P102-103)

Read more »

后置递增运算符的优先级高于解引用运算符,因此*p++等同于*(p++)

将p+1后返回p的初始值

Read more »

inline 函数

将函数声明为inline可以避免函数调用的开销,空间换时间

调用函数步骤:

  1. 返回地址压栈
  2. 函数参数压栈
  3. 计算返回值
  4. 函数部分所有元素出栈,返回值

普通函数与inline函数的汇编代码对比

inline函数不是定义是声明,应该写在头文件里,保证编译器将其作为inline函数展开

宏定义与inline函数的区别

宏定义 inline函数
类型检查
实现方式 预处理时展开 由编译器实现展开,是否将函数作为inline依赖于编译器的判断
其他 容易引发运算符优先级的问题,不可调试 可以调试
Read more »

六大部件

stl_items.png

分配器:为容器分配内存

迭代器:算法只能通过迭代器访问容器

容器

stl.png

Array

定长数组

_M_instance:指向数组首元素的指针(int a[10]的a)

array_overview.png
Read more »

限制条件

只能重载存在的运算法

重载运算符必须保留相同操作数数量和优先级

成员或全局函数

单目运算符应该做成成员函数

= () []只能做成成员函数

所有其他二元运算符做成非成员函数

其他

成员函数左操作数(reciver)必须是隶属于同一个class的对象

加const可以防止返回结果做左值

Read more »

  1. endl将与设备关联的缓冲区(buffer)中的内容刷到设备中。在调试时应保证”一直”刷新流。否则若程序崩溃,输出可能还是缓冲区,导致对于程序崩溃位置的错误推断

  2. 读取数量不定的输入数据可用while (std::in >> value)

    当遇到文件结束符(end-of-file),或遇到一个无效输入时,istream对象状态变为无效,使条件为假

    EOF:在Windows中为Ctrl+Z,UNIX为Ctrl+D

C++编译过程

  1. 预处理(Preprocessing)

    将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。gcc的预处理是预处理器cpp来完成的。(include只做文本插入,在include的位置将头文件展开)

  2. 编译(Compilation)

    这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。

    一个cpp文件是一个编译单元。

  3. 汇编(Assemble)

    汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。

    这一步会为每一个源文件产生一个目标文件

  4. 链接(Linking)

    链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)

compiler

预处理阶段将宏所写内容替换

宏没有类型检查

在宏外加括号防止运算符优先级错误

在宏后不需要加分号(非C++语句)

头文件

Read more »