第一章 快速入门
每个C++程序包含一个或者多个函数,而且必须有一个命名为main函数。函数由执行函数功能的语句序列组成。操作系统通过调用main函数来执行程序。Main函数则执行组成自己的语句并返回一个值给操作系统。
定义函数必须制定四个元素:返回类型、函数名、形参表(可能为空)和函数体。
Main函数的返回类型必须是int型;int型是内置类型,由C++语言定义;函数体是以花括号开始并以花括号结束的语句块。C++中多数语句以分号作为结束标记。
编辑 编译 执行
C++并没有直接定义进行输入或者输出的任何语句,这些功能是由标准库提供的
iostream库——处理格式化输入和输出的库,其基础是istream和ostream类型,分别表示输入流和输出流;标准库定义了四个IO对象,即cin(标准输入), cout(标准输出), cerr, clog;系统将这些对象与执行程序的窗口联系起来;运行程序时,大部分操作系统都提供了重定向输入或输出流的方法。
C++中,一个表达式由一个或者几个操作数和通常是一个操作符组成;每个表达式都会产生一个结果。
endl是一个特殊值,成为操纵符。将它写入输出流时:(1)具有输出换行的效果 (2) 刷新与设备相关联的缓冲区,从而使得用户可以立即看到写入到流中的输出。
命名空间;作用域操作符(::);点操作符(.):仅应用于类类型的对象;调用操作符();
形参;实参;成员函数,方法
字符串字面值
Iostream库定义了接受全部内置类型的输入输出操作符版本。
控制结构:while语句;for语句;if语句
编译器不能查出程序的意义是否正确,但是可以查出程序形式上的错误:(1) 语法错误 (2) 类型错误 (3) 声明错误
建议按照错误报告的顺序改正错误
C++中,每个数据项都有其相关联的数据类型。
操作系统使用不同的值作为文件结束符。Windows下是CTR+Z,UNIX下是CTR+D
C++通过定义类来定义自己的数据结构,C++的设计焦点是使得所定义的类类型的行为像内置类型一样自然。
C++是静态类型语言,在编译时,执行类型检查。二Python在运行时才检查语句中对象的类型
第二章 变量和基本类型
算术类型:bool,char, wchar_t, short, int, long, float, double, long double
通常将8位的块作为一个字节,32位或者4个字节作为一个字(word)
对象的类型决定了对象可以执行的操作
初始化:赋值初始化;直接初始化
C++中,变量必须且仅能定义一次,而在使用变量前必须定义或声明变量
整型的赋值:对于unsigned类型来说,编译器必须调整越界值使其满足要求;将该值对unsigned类型的可能取值数目求模,然后取所得值。
C++中,每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可以用于该变量上的操作集。
对象是内存中具有类型的区域
变量初始化规则:内置类型变量的初始化(建议每个内置类型的对象都要初始化);类类型变量的初始化
全局作用域;局部作用域;语句作用域
const对象默认为文件的局部变量,必须要初始化,且其值不能被修改
引用就是对象的另一个名字,主要用作函数的形式参数;是复合类型,即用其他类型定义的类型。
typedef, enum, class, struct:用class和struct关键字定义类的唯一差别在于默认访问级别,默认情况下,struct的成员为public,而class的成员为private。
定义类时,通常先定义该类的接口,即该类所提供的操作,通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。
数据成员;成员函数;访问标号
因为头文件包含在多个源文件中,所以不应该含有变量或者函数的定义,头文件可以定义类、值在编译时就已经知道的const对象和inline函数。
C++预处理器;头文件保护符;预处理器变量,避免多重包含。
第三章 标准库类型
抽象数据类型
String类型支持长度可变的字符串;vector是同一种类型的对象的集合,是一个类模板;bitset。
仅能对确定已存在的元素进行下标操作,试图对不存在的元素进行下标操作将导致“缓冲区溢出”错误
迭代器iterator是一种检测容器内元素并遍历元素的数据类型,标准库为每一种标准容器定义了一种迭代器类型;迭代器算术操作
采用C标准库头文件的C++版本
Inline函数:编译器遇到内联函数就会直接扩展相应代码,而不是进行实际的函数调用,像size这样的小库函数几乎都定义为内联函数。
第四章 数组和指针
C++提供了两种类似于vector和迭代器的低级复合类型,即数组和指针。
数组与vector类似,也能够保存某种类型的一组对象,区别是数组的长度是固定的,一经创建,就不允许添加新的元素;指针可以像迭代器一样用于遍历和检查数组中的元素
现代C++程序尽量使用vector和迭代器类型,避免使用低级的数组和指针;只有在强调速度时,才在类实现的内部使用数组和指针。
数组是由类型名、标识符和维数组成的复合类型;数组定义中的类型名可以是任意内置类型,任意类类型,以及除引用外的任意符合类型。
指针是复合类型,每一个指针都有一个与之关联的数据类型,该数据类型决定了指针所指向的对象的类型。
字符串字面值包含一个额外的空字符(‘\0’)用于结束字符串。
与vector不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组。
现代C++程序采用vector类型和迭代器取代数组,采用string类型取代C风格字符串。
Void*指针:可以与另一个指针进行比较;可以向函数传递void*指针或者从函数返回void*指针;可以给另一个void*指针赋值;不可以使用void*指针操纵其指向的对象。
C++使用**操作符指派一个指针指向另一个指针
指针的算术操作:在指针上加上或者减去一个整型数组等效于获得一个新指针;C++允许计算数组或者对象的超出末端的地址,但是不允许对此地址进行解引用操作。
指向const对象的指针;const指针。
创建动态数组:new,delete[];动态分配数组时,只需要指定类型和数组长度;如果回收数组时,缺少[],至少会导致运行时少释放了内存空间,从而产生内存泄露。
第五章 表达式
删除指针后,指针变成了悬垂指针,建议立即将其置0.
类型转换:dynamic_cast, const_cast, static_cast, reinterpret_cast
第六章 语句
Break语句用于结束最近的while,do while,for 或者switch语句 (不包括if-else),并将程序的执行权传递给紧接在被终止语句之后的语句。
Continue语句导致最近的循环语句的当次迭代提前结束。
Try和异常处理:throw表达式,try块;使用预处理器进行调试;使用NDEBUG预处理器变量和assert预处理宏进行调试。