程序设计复习
函数与递归
不是类成员的函数是全局函数。
函数原型 (声明)确定:函数名、返回类型、形参数目、形参类型、形参顺序。其中函数名和形参类型合称为 函数签名。
函数原型的一大特征是 实参类型强制转换 。从高类型到低类型的转换可能会产生错误(例如精度丢失)。
随机数 的产生需要头文件
cstdlib
。其中:
rand()
函数用于产生随机数(rand()%n实现比例缩放)
srand(time(0))
通过读取当前时间设置随机数种子枚举类型enum 中存在枚举常量显示设置和隐式设置值的情况。
enum Months{JAN=1,FEB,MAR...}
其中FEB会隐式设置为2。
enum Days{FIR,SEC,THR...}
这里的FIR会隐式设置为0。C++提供了5个 存储类别说明符 :
auto
、register
、extern
、mutable
、static
。
其中auto
和register
为 自动存储类别说明符 ,说明标识符的存活时间是标识符出现到程序块执行完毕。register
说明符建议编译器在计算机高速硬件寄存器中而不是在内存中存储该变量,但是上述步骤可以由编译器自己完成。
其中extern
和static
为 静态存储类别说明符 ,说明在全局范围内的全局静态变量可以访问。声明为static
的局部变量仍然具有局部作用域。内联函数inline 让编译器直接在函数调用处将函数调用语句替换为相应的函数定义,避免编译器到处寻找函数定义位置。
函数名相同、形参不同的情况可以通过 函数重载overloading 实现。重载函数通过 函数签名 区分。
递归与迭代都是基于 控制语句 实现的,但是:
递归是选择结构;迭代是循环结构。
指针
指针变量:将内存地址作为值。 指针可以被声明为指向任何对象 。
初始化指针 时,0和NULL是等价的。
定义指针时,
*
运算符 应该和变量名放在一起:int *ptr
。使用const修饰指针的意义:
const int *const ptr
中前一个const
说明 指针指向的数据是常量 不可修改,而后一个const
说明 指针本身是一个常量 不可更改。基于指针的字符串都是以 空字符
\0
结尾的。
运算符重载
运算符的重载函数一般声明为 友元friend 。
运算符重载的 语法格式 如下:
ostream &operator<<(ostream &, const Student &)
bool operator!(const string &)
使用
new
进行 动态内存分配 的结构是在 自由存储区heap 中创建对象和数组。关键字
explicit
用于禁止不应被允许的由转换构造函数完成的隐式类型转换。
面向对象编程的3大特性
封装encapsulation
封装是指将数据和函数集合在一个抽象数据类型中。
意义:
- 保护或防止代码和数据被破坏或篡改;
- 通过代码重用降低软件开发复杂度;
- 封装解决命名冲突。
继承Inheritance
继承是指一个类通过得到另外一个类的内部数据结构来实现对该类概念的具体化。
意义:
- 重用代码,节省开发时间;
- 增强类之间的关系;
- 为多态性做准备。
多态polymorphism
多态是指作用于不同对象的同一操作(函数)可以拥有不同的解释( 函数执行语句 )并 产生不同的执行结果 。
多态分为编译时多态和运行时多态。
编译时多态 体现为 函数重载 。好处是编译速度更快。
运行时多态 体现为 虚成员函数 。好处是提供更好的代码灵活性和抽象性。
多态存在的条件:
- 存在继承;
- 子类重写了父类的方法;
- 父类引用指向子类对象。
模板
函数模板
template<typename T> void function(const T *const array, int count) { //implementation }
类模板
template<typename T> class Stack{ public: Stack(); ~Stack(); private: vector<T> data; };
注意模板与继承之间的存在的联系(490页)
I/O流
获取特定输入内容:
get
函数getchar
函数getline
函数
输出流操作符
- 设置整数流的基数:
dec
、oct
、hex
、setbase()
。 - 浮点精度:
cout.precision(n)
、setprecision(n)
。 showpoint
设置打印尾数零。- (更多详见课本)
- 设置整数流的基数:
异常处理
语法结构
try{ //logic sentences to be tested if(logic error){ throw Exception(); } } catch(Exception exception){ //related operation }
注意catch语句执行的层次调用。
文件处理
文件对象的语法结构
ofstream outfile("filename",ios::out); ifstream infile("filename",ios::in);
其中,ios::out和ios::in是文件处理的模式,如下表所示:
ios::app
在文件末尾进行添加;ios::ate
打开文件,把光标移至文件尾部,是添加模式;ios::in
标准读入模式;ios::out
标准输出模式;ios::trunc
输出覆盖已有内容,是ios::out
默认设置;ios::binary
打开文件进行二进制输入或输出。
结构体
结构体的定义
struct StructName{ int id; string name; ... };
需要注意结构体的内存对齐问题。
使用
typedef
可以自定义类型名称。typedef int myInt; //此时myInt是int类型的别名 myInt number = 6; //number变量其实就是int类型
str转其他类型
atoi()
字符串转int
类型;atof()
字符串转float
类型;atod()
字符串转double
类型;strtol()
字符串转long
类型。
string字符串处理
strcpy
函数与strncpy
函数:字符串复制strcat
函数与strncat
函数:字符串拼接strcmp
函数与strncmp
函数:字符串比较strtok
函数:字符串按字符进行分割strlen
函数:求字符串长度
其他字符串函数详见课本
687
页。