C++编程思想
想法
大学选的计算机专业,学习的第一个也是唯一有课程教学的语言就是C++。为了考试,书也是看了两三遍,不过很基础的一本书,还是根据章节重点,死记硬背的。
毕业时,没学过C++吧,大学都有课程。写个代码吧,找猫花虎也要吭哧半天。数据结构可能是背过了,但什么宏、友元、继承、虚函数等等,仿佛都是浮于表面的记忆,浅薄的理解,根本谈不上实践和灵活运用。
应届面试,背几个排序、字符串操作,也就过去了。第一年工作,却走向了java的方向。
后面不甘平静的自己又换部门,走向了一线,走出了国门,实践了很多shell、python脚本以及mysql数据操作,但却和C++渐行渐远。
心中总想作为一名计算机毕业生,应该捡起这个最初的也是最强大的武器,至少可以实践和应用。于是,趁着休息实践,仔细整理和复习一下,希望可以拿起来它。
网址
资源: http://mindviewllc.com/quicklinks/
编译过程
基本编译流程
对应文件变化
基础语法加深
指针和引用作用
作用效果:给函数传递外部变量地址
- 在函数内改变”外部对象”,指针最基本的用途。类似于python: global [不可变变量] 或 通过list、dict修改元素内容
- 获取更灵活的编程技巧
- C和C++默认参数传递都是值传递,所以想要修改传入参数的变量必须通过指针或引用 注意点:
- C++允许任何指针赋值给void*, 但不允许将void指针赋给任何其他类型指针。(C都允许)
变量
- 全局变量: 函数体外部定义,程序运行期始终有效,外部文件可通过extern调用
- 局部变量: 作用域(函数)内有效,默认是auto,不需要auto关节字显示声明
- 寄存器变量: 关键字register声明,加快访问,不能使用地址,只能声明在一个块中(不能全局或静态),函数中可做形参。相信编译器,慎用
- 静态变量: static关键字,在函数范围内持续可用(多次调用该函数时);同时表明作用域,可用于函数和变量,当前文件作用域内可用,外部不可以extern调用。
- 外部变量: extern关键字引用,定义在其他文件或者当前代码的后面。
- 常量: 预处理定义: #define PI 3.1415926,没有作用域,从定义到文件结束有效;命名常量: const声明,同其他变量一样有作用域,必须有初始值。
- volatile变量: 编译器不进行额外优化,可应用于多线程同时修改的标识符 注意点:
- C++允许变量在作用域内任何点上定义(和python一样哦),C只允许在作用域开头定义
连接
- 内部连接: 关键字static指定,只对正在编译的文件创建存储空间
- 外部连接: 为所有被编译过的文件创建一片单独的存储空间,通过extern引用(函数名或全局变量)。函数和函数外部定义的全局变量,都可以通过extern从其他文件访问,const需要用extern显示指定为外部变量。
显示转换
- 静态转换(static_cast): 用于明确定义的转换,包括编译器允许不用强制转换的”安全”转换和不太安全但清楚定义的转换。
- 常量转换(const_cast): const转换为非const或从volatile转换为非volatile。
- 重解释转换(reinterpret_cast):把类型转化成需要使用的类型,这个类型不同于本来的类型,对原本类型的重解释。
数据抽象
含义:
- 在结构内部放入函数,称作 抽象数据类型(abstract data type)
- 用这个结构创建的变量称为这个类型的对象或实例(instance)
- 调用对象成员函数称为向这个对象发消息(sending a message)(想到了object-c哈)
- 面向对象程序设计的主要动作就是向对象发消息
内存分配
标准C动态内存分配: malloc()、calloc()、realloc()、 free()
C++使用关键字new和delete:
- new: 一般形式:new Type;数组: char* s = new char[100];
- delete: 一般形式:delete 类型实例的指针;数组: delete[] s;
对象
- C通过struct将函数捆绑在数据结构内部,是基于对象的,不是面向对象。
- 一个struct的大小仅仅是它所有成员大小的和。
头文件
- C++要求定义和使用的函数和数据都要在头文件中声明,之后在需要使用或定义的文件中引用该头文件。C可以直接定义,可以通过避免打开多个文件略微提高编译速度。
- 注意一条规则: 可以对事物声明任意多次,但是对每个事物只能实际定义一次。
- 防止重声明,使用预处理指示符#define(定义); #undef(取消定义); #ifdef(判断是否定义);#ifndef(判断是否未定义);#endif(对应 #ifdef 或 #ifndef。判断包结束,同一行中要带注释: #endif // FLAG)