0%

逻辑控制

do…while… 至少会执行一次的循环逻辑

哨兵(sentinel)字符: 一直读取,直到’他‘为止

检查文件是否正确打开很关键

用string读ifstream数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fstream>
#include <string>
int main()
{
using namespace std;
ifstream inFile;
inFile.open(filename);
if(!inFile.is_open())
{
cout <<"Failed Open";
exit(EXIT_FAILURE);
}
// 逐行读放在string
string str;
getline(inFile, str);
//stoi, stof, stod
}

关于函数,真正的乐趣在于编写自己的函数,函数库

指向const的指针以及const指针

递归使用

1
2
3
4
5
6
7
void recurs(arg)
{
stat1
if(test)
recurs(arg)
stat2
}

先执行stat1,打开满足条件,打开新的递归;直到新的递归不满足条件,逐步执行stat2并关闭当前函数;直到所有打开的函数都关闭了。

函数指针

用函数指针将第一函数找到第二函数,而非直接调用;虽然笨拙,但好处是可以在不同时间传递不同的函数地址;
语法:double (*pf)(int);

应尽量使用const

1.使用const可以避免无意中修改数据的失误
2.使用const使函数能够处理const和非const实参,否则将不能处理const实参
3.使用const引用使函数能够正确生成并使用临时变量

引用非常适合用于结构和类

何时使用引用参数:1.能够修改调用函数中的数据对象 2.通过传递引用而非拷贝提高程序运行速度

语法糖:函数默认参数从右往左

函数多态:重载函数

不应滥用,适用于不同参数类型输入,完成基本一致功能的多个函数使用,const与非const也不一样

函数多态:模板编程

1
2
3
4
5
6
7
8
9
template <typename T>  // typename -> class is ok
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}

编译器如何匹配最佳函数是一个复杂而完备的过程,大致规则如下:
1.完全匹配,但常规函数优于模板
2.提升转换(char/shorts提升至int, float提升至double)
3.标准转换(int 转换char, long 转换double)
4.用户定义的转换,如类声明