此为本人读书记录,thinking in C++ 第三章 :C++中的C
3.1创建函数
在C++中,函数定义的参数表中可以使用未命名的参数
3.1.1 函数的返回值
C++函数原型必须指明函数的返回值类型(在C中,如果省略返回值,则默认为返回int型)
3.1.2 使用C的函数库
3.1.3 通过库管理器创建自己的库
3.2 执行控制语句
3.2.1 真和假
3.2.2 if-else语句
3.2.3 while语句
3.2.4 do-while 语句
3.2.5 for语句
3.2.6 关键字break和continue
3.2.7 switch
3.2.8 使用和滥用goto
3.2.9递归
3.3运算符简介
3.3.1优先级
3.3.2自增和自减
3.4数据类型简介
用户自定义的数据类型,作为一个类,被称为抽象数据类型
3.4.1 基本内建类型
3.4.2 bool类型与true和false
3.4.3 说明符
说明符(specifier)用于改变基本内建类型的含义并把它们扩展成一个更大的集合。有4个说明符,long short、signed、unsigned
3.4.4 指针简介
相继定义的变量在内存中是连续存放的,它们根据自己的数据类型所要求的字节数分开来。
3.4.5 修改外部对象
3.4.6 C++引用简介
带引用的函数调用比带指针的函数调用在语法上更清晰。
3.4.7 用指针和引用作为修饰符
如果声明指针是void*,它意味着任何类型的地址都可以间接引用那个指针。 可能造成个漏洞,int*改变引起存储空间的大小。
3.5 作用域
3.5.1 实时定义变量
3.6 指定存储空间分配
3.6.1 全局变量
如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以访问这个数据。
3.6.2 局部变量
3.6.2.1 寄存器变量
寄存器变量是一种局部变量,关键字register告诉编译器“尽可能快的访问这个变量”,使用register的限制:不能得到register的地址,register只能在一个块中声明,不可能有全局的或静态的register变量。可在函数中使用register变量作为一个形式参数。
3.6.3 静态变量
3.6.4外部变量
3.6.4.1 连接
连接用连接器所见的方式描述存储空间。连接方式有2种,内部连接和外部连接。在C/C++中,内部变量是又关键字static指定的。 外部连接意味着为所有编译过的文件创建一片单独的存储空间。 函数之外定义的所有变量(在c++中除了extern声明)和函数定义默认为外部连接。可以使用关键字static特地强制它们具有内部连接,也可以在定义时使用extern显示指定标识符具有外部连接。 调用函数时,自动(局部)变量只是临时存在于堆栈中,连接器不知道自动变量,所以这些变量没有连接。
3.6.5常量
修饰符const 告诉编译器这个名字表示常量,不管是内部的还是用户定义的数据类型都可以定义为const,试图修改会报错。
3.6.5.1常量值
在C++中,一个const必须有初始值(在c中不是),常量值前带0被认为是八进制数。带0x被认为16进制。
3.6.6 volatile变量
限定词volatile告诉编译器“不知何时改变”。防止编译器依据变量的稳定性做任何的优化。
3.7运算符及其使用
3.7.1赋值
3.7.2 数学运算符
3.7.2.1预处理宏介绍
3.7.3关系运算符
3.7.4 逻辑运算符
3.7.5 位运算符
位运算符只适用整形char、int、long。
3.7.6移位运算符
3.7.7 一元运算符
3.7.8 三元运算符
a= --b? b:(b=-99);理解为如果b自减运算的结果为0,则把b的值赋给a,如果b变为0,a和b都变为-99.b总是在递减,只有为0,才被赋值为-99.
3.7.9 逗号运算符
3.7.10 使用运算符时的常见问题
=与==,&与&&
3.7.11转换运算符
(cast),
3.7.12C++的显示转换
3.7.12.1 静态转换(static_cast)
static_cast 全部用于明确定义的变换,包括典型的非强制转换,窄化变换,使用void*的强制转换,隐式类型变换和类层次的静态定位。
3.7.12.2 常量转换(const_cast)
如果从const转换为非const或从volatile转换为非volatile。可以使用const_cast.
3.7.12.3 重解释转换(reinterpret_cast)
3.7.13 sizeof——独立运算符
sizeof是一个运算符,不是函数。如果对变量使用,可以不要括号。
3.7.15 显示运算符
3.8创建复合类型
3.8.1 用typedef命名别名
3.8.2用struct把变量结合在一起
struct的声明必须以分号结束
3.8.2.1指针与struct
3.8.3用enum提高程序清晰度
3.8.4用union节省内存
3.8.5数组
3.8.5.1指针和数组
c++中函数main()有特殊的参数列表
int main(int argc,char* argv[ ]){ }
第一个参数的值是第二个参数的数组元素个数,第二个参数总是char*数组,因为数组中的元素来自作为字符数组的命令行。
3.8.5.2探究浮点格式
3.8.5.3指针算术
不能把2个指针相加,指针相减得2个指针间隔的元素个数
3.9调试技巧
3.9.1调试标记
3.9.1.1预处理器调试标记
3.9.1.2 运行期调试标记
3.9.2 把变量和表达式转换成字符串
3.9.3 c语言assert()宏
3.10函数地址
函数载入计算机执行后有一块内存,这个内存有个地址,可以通过指针使用函数地址
3.10.1定义函数指针
定义一个指针指向一个无参无返回值的函数,可写成: void(*funcptr)(); 如果不加括号,void *funcptr();可能为声明一个函数
3.10.2复杂的声明与定义,
void * (*(*fp1)(int))[10];表示fp1是一个指向函数的指针,该函数接受一个 整形参数,并返回一个指向含有10个void指针数组的指针。
float(*(*fp2)(int,int,float))(int);fp2是一个指向函数的指针,该函数接受3个参数(int、int和float)且返回一个指向函数的指针,该函数接受一个整形参数并返回一个float。
3.10.3使用函数指针
3.10.4指向函数的指针数组
3.11 make:管理分段编译
3.11.1make的行为
3.11.1.1宏
3.11.1.2后缀规则
3.11.1.3默认目标
3.11.2本书中的makefile
3.11.3makefile的一个例子