Essential C++ (2.3--2.6)

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);

默认参数值的两个规则:

  1. 默认值的解析操作必须从最右边开始:(***,默认值);
  2. 默认值只能指定一次,在函数声明和函数定义处,两者选一(为了更高的可见性 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,表示编译器在每个函数的调用点上,将函数的内容展开。

将一个函数调用操作改为一份函数代码副本

使用函数的优缺点:(多用于频繁调用的短函数)

  1. 函数易读易维护
  2. 调用函数有开销

内联函数:将代码插入到调用处,以空间换时间,会造成程序变大

2.6 提供重载函数

参数列表不同(类型,个数之类)的多个函数有相同的名字

名称相同,编译器用来看传的参数类型来选择对应的函数

注意:返回类型不能将函数重载

ostream& display_message(char ch);
bool display_message(char ch);

这两个函数不能实现重载,只有返回类型不同

注意:main函数不能重载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值