面向过程编程风格
每个函数必须定义一下四个部分:
1、函数返回类型
2、函数名
3、参数列表
4、函数主体
知道某个类型的最大、最小值
#include <limits>
int max_int = numeric_limits<int>::max();
double min_dbl = numeric_limits<double>::min();
函数调用
当我们调用函数时会在内存区建立一块特殊区域,称为“程序栈”,这块特殊区域为每个函数参数提供存储空间,为对象提供内存空间,即局部对象,一旦函数完成,这块内存将被释放。
将参数声明为引用的理由:
1、希望对直接对传入的对象进行修改,重要
2、减轻复制大型对象的负担,不重要
指针参数和引用参数的差异:
指针可能(也可能不)指向某个实际对象,使用时首先判断指针不为0;引用必定会代表某对象,不用作此检测。
除非在函数内需修改参数值,否则建议传递内建类型时不使用传址方式,传址方式主要作为传class object用。
生存空间和生存范围
除了一个例外(static),函数内定义的对象只存活与函数执行之际,如果将局部对象以地址返回,就会出错,以传值方式返回不会出任何错误。
对象在程序内的存活区域成为对象的生存空间。分为局部变量和全局变量。
内建类型的对象如果定义为全局变量,则被初始化为0,否则需程序员为其赋初值。
管理动态内存
new Type;
new Type(initial_value); Type可以为任意内建类型或已知class。
例 int *pi;
pi = new int;
pi = new int(1);
提供默认参数值
参数提供默认值规则:
1、默认值的操作从最右边开始,如果我们为某个值提供了默认值,其右边的参数必须都提供默认值。
2、默认值只能指定一次,声明处或定义时。
// error: no default value for vec
void display(ostream &os = cout, const vector<int> &vec);
函数声明通常至于头文件中,为提高透明度,默认值在声明处提供。
// header file declaration specifies default value
// let's call the header file: NumericSeq.h
void display(const vector<int>&, ostream&=cout);
// program text file definition includes header file
// the definition itself does not specify the default value
#include "NumericSeq.h"
void display(const vector<int> &vec, ostream &os)
{
for (int ix = 0; ix < vec.size(); ++ix)
os << vec[ix] << ' ';
os << endl;
}
使用局部静态对象
const vector<int>*
fibon_seq(int size)
{
const int max_size = 1024;
static vector<int> elems;
if (size <= 0 || size > max_size){
cerr << "fibon_seq(): oops: invalid size: "
<< size << " -- can't fulfill request.\n";
return 0;
}
// if size is equal to or greater than elems.size(),
// no calculations are necessary ...
局部静态对象所处的内存空间,即使在不同的函数调用中依然存在,可以安全将地址返回。
声明inline函数
编译器在函数调用点上将函数内容展开,将函数调用操作改为以一份函数代码副本取代。
函数最好是体积小,常被使用,计算不复杂。
inline函数定义常置于头文件里。
重载函数
编译器将调用者提供的实际参数与每个重载函数比较选出最恰当的。
返回值类型不足以区分重载函数。
模板函数
将参数表中指定的所有或部分参数的类型信息抽离出来,
template <typename elemType>
void display_message(const string &msg,
const vector<elemType> &vec)
{
cout << msg;
for (int ix = 0; ix < vec.size(); ++ix)
{
elemType t = vec[ix];
cout << t << ' ';
}
}
关键词typename表示elemType在display_message函数中,只是个临时放置类型的代称。
一般而言,如果函数具备多种实现形式我们可以将它重载,每份实体提供的是相同的通用服务,如果想要函数的主体不变只是改变其中用到的数据类型,可以通过模板函数达到目的。
函数指针
函数指针必须指明所指向函数的返回值类型和参数列表。
const vector<int>* (*seq_ptr)(int);