2.3 提供默认参数值
以参数传递来取代全局变量的原因:函数如果过度依赖定义于 file scope 中的对象,就比较难以在其它环境中重用,也难以做修改。
void bubble_sort(vector<int> &vec, ofstream *ofil = 0){
// ofstream *ofil 直接定义为0,也就是默认值
for (int ix = 0; ix < vec.size(); ++ix) {
for (int jx = ix + 1; jx < vec.size(); ++jx) {
if (vec[ix] > vec[jx]) {
ofil << "about to call swap! "
<< " ix: " << ix << " jx: " << jx << '\t'
<< " swapping: " << vec[ix]
<< " with " << vec[jx] << endl;
swap(vec[ix], vec[jx]);
}
}
}
}
// 在函数调用时,不会产生问题
bubble_sort(vec);
默认参数值的两个规则:
- 默认值的解析操作必须从最右边开始:(***,默认值);
- 默认值只能指定一次,在函数声明和函数定义处,两者选一(为了更高的可见性 visiblity,我们将默认值放在函数声明处,并非定义处)
2.4 使用局部静态对象
局部静态对象: 在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响,静态对象只初始化一次
静态全局对象和一般的全局对象的区别:
一般的全局对象在程序的其他文件中可以通过关键字extern来调用,而static声明的全局变量则只能在本文件中使用,这是链接性一个是外部的,一个是内部的!
在前面求斐波拉契数列的前n项时
fibon_seq(24);
fibon_seq(8);
fibon_seq(13);
第二和第三行的内容都包含在了第一行已经求过内部,如果再从头算,有点浪费时间了。
因此我们用一个局部静态对象
const vector<int>* fibon_seq(int size){
const int max_size = 1024;
static vector<int> elems; // 定义一个局部静态对象,用来存截至到size的斐波那契数
if(size <= 0 || size > max_size){
cerr << "fibon_seq(): oops: invalid size: "
<< size << " -- can't fulfill request.\n";
return 0;
}
// 如果size小于elem.size(),那么已经存好了,不用再重新计算,会直接跳过for循环
for(int ix = elems.size(); ix < size; ++ix){
if(ix == 0 || ix ==1)
elems.push_back(1);
else elems.push_back( elems[ix-1] + elems[ix-2] );
}
return &elems;
}
2.5 声明 inline 函数
将函数声明为 inline,表示编译器在每个函数的调用点上,将函数的内容展开。
将一个函数调用操作改为一份函数代码副本
使用函数的优缺点:(多用于频繁调用的短函数)
- 函数易读易维护
- 调用函数有开销
内联函数:将代码插入到调用处,以空间换时间,会造成程序变大
2.6 提供重载函数
参数列表不同(类型,个数之类)的多个函数有相同的名字
名称相同,编译器用来看传的参数类型来选择对应的函数
注意:返回类型不能将函数重载
ostream& display_message(char ch);
bool display_message(char ch);
这两个函数不能实现重载,只有返回类型不同
注意:main函数不能重载