2.1 如何撰写函数
函数定义四要素:函数的返回类型、函数的名称、函数的参数列表、函数体
占位符(placeholder) 函数原型(function prototype)
exit() 头文件cstdlib
求某个类型的最小最大值,可查询标准程序库中的numeric_limits class
#include <limits>
cout << numeric_limits<int>::max();
巧用default
switch(pox){
default:
case 2:
cout << "1 ";
case 1:
cout << "1 ";
break;
}
当超过2的时候全部输出1 1
2.2 调用一个函数
传址(by reference)、传值(by value)
void display( const vector<int> &vec)
加上const可以让阅读程序的人了解,我们以传址的方式来传递vector,为的是避免复制操作,而不是为了在函数之中对它进行修改。
等同于 void display( const vector<int> *vec);
比较:
效果相同,传递的都是对象的地址。
用法不同,一个*号,一个&号
pointer可能(也可能不)指向某个实际对象。当我们提领pointer时,一定要先确定其值并非为0,至于reference则必定会代表某个对象,所以不须检查。
生存空间(scope) 生存范围(extent) 局部对象(local object)
内置类型的对象,如果定义在file scope之内,必定被初始化为0,但如果它们被定义于local scope之内,那么除非程序员指定其初值,否则不会被初始化。
heap memory(堆内存) new表达式的另一种形式允许我们指定初值
int *pi; pi = new int(1024); //这不是之前的构造函数语法么
delete pi; 不需要检验pi是否为零,编译器会替我们检查 if(pi != 0) //define NULL 0
2.3 提供默认参数值(Default Parameter Values)
调试时候用
默认参数值从最右边开始进行。
默认值只能指定一次,可以在函数声明处,也可以在定义处。一般放在声明处。
void bubble_sort( vector<int> &vec, ofstream *ofil = 0){ if(!ofil){...} } bubble_sort(vec);//不会产生调试信息 ofstream ofil( "data.txt" ); bubble_sort(vec, &ofil);//会产生调试信息 void bubble_sort( vector<int> &vec,ostream &ofil=cout) bubble_sort(vec, ofil); //调用,不用加取值符 ostream 处理流,基类,写 istream 处理流,基类,读 iostream 处理流,基类,读写 ofstream 处理文件流,子类,写 ifstream 处理文件流,子类,读 fstream 处理文件流,子类,读写 istringstream 从string读取数据 ostringstream 向string写入数据 stringstream 读写string
头文件可为函数带来更高的可见度
2.4 使用局部静态变量(local static objects)
局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续存在。
static vector< int > elems; elems.push_back( elems[ix-1]+elems[ix-2] );
vector class 提供有内存自动管理机制,动态内存。
2.5 声明一个 inline 函数
体积小,常被调用
inline函数的定义常常被置于头文件中
类内定义的函数被默认成内联函数。关键字inline 必须与函数定义体放在一起才能使函数成为内联
2.6 提供重载函数(overloaded functions)
返回值、函数名相同,参数列表不同(类型不同,个数不同,顺序不同(string s1, int s2)和(int s2, string s1)(本质还是类型不同))
2.7 定义并使用template functions(模版函数)
将参数列表中指定的所有(或部分)参数的类型信息抽离出来
加入类型为ostream的第三参数,并将其预设参数值为 cout,是更具弹性的一种做法。
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()函数中仍是一个临时放置类型的代称。
模版函数的参数列表通常由两类类型构成,一类是明确的类型,另一类是暂缓决定的类型。
//模版再经重载: template <typename elemType> void display_message( const string &msg, const vector<elemType> &vec ); template <typename elemType> void display_message( const string &msg, const list<elemType> < );
2.8 函数指针(pointers to functions)带来更大的弹性
必须指明其所指向函数的返回值类型及参数列表。
const vector<int>* (*seq_ptr)( int );
需要重视这个问题!!!!
2.9 设定头文件(header files)
extern 跨文件范围,其他文件也能访问