C++Essential 个人总结(二)
第二章
2.1、如何编写函数
函数组成:返回类型,函数名,参数列表,函数体
void foo(int i){...}
函数必须先被声明,然后才能被调用(被使用),函数声明不必提供函数体,但必须指明返回类型、函数名、以及参数列表——函数原型(function prototype)
//函数声明
int fibon_elem( int pos);
函数的定义则包含函数原型和函数体
编写函数需要注意的两个问题
- 输入有效性检查
用户可能会错误输入,导致程序无法运行 - 内存溢出
每个值类型只能表示值域内最小至最大值间的数
代码实现
#include <iostream>
using namespace std;
bool fibon_elem( int ,int &);
bool fibon_elem( int pos,int &elem)
{
elem =1;
int n_1=1,n_2=1;
if (pos<0||pos>1024)
return false;
for( int ix=3; ix<=pos;ix++)
{
elem=n_1+n_2;
n_1=n_2;n_2=elem;
}
return true;
}
int main()
{
int pos;
cin>>pos;
int elem;
if( fibon_elem(pos,elem))
cout <<"element # " <<pos<<" is "<<elem<<endl;
else
cout <<"Sorry, couldn't calculate"<<endl;
}
代码实现
const vector <int>* fibon_seq(int size)
{
const int max_size=1024;
static vector<int> elems;
if (size<=0||size>max_size)
{
std::cerr << "fibon_seq():oops:invalid size" << '\n';
return 0;
}
for (int ix=elems.size();ix<=max_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 function):将函数声明为inline,表示在函数每个调用点上,将函数的内容展开,面对一个inline函数,编译器将函数的调用操作改为一份函数代码副本代替,只要在函数前面加上关键词inline,便可将函数声明为inline
最适合声明为inline的函数,是体积小,常被调用的从事的计算不复杂的函数
2.6、 提供重载函数
函数重载(function overloading):参数列表不相同(参数类型或参数个数)的两个或多个函数可以拥有相同的函数名称,但编译器不能根据函数返回类型区分两个具有相同名称的函数
2.7、 定义并使用模板函数
function template(函数模板)以关键字template开头,以成对尖括号<>包围起来的一个或多个标识符
template <typename elemType> void display_message( const string &msg, const vector<elemType> &vec)
{
//函数体
}
关键词typename表示,elemType是函数中的暂时放置类型的占位符,可以任意取名字。
function template的参数列表通常都由两种类型构成:一类是明确的类型,另一类是暂缓决定的类型。
使用方式
vector <int> ivec; string msg;
display_message(msg,ivec);
编译器会将elemType绑定为int类型,产生一份display_message()函数实例;
一般而言,如果函数具备多种实现方式,可以将其重载(overload),每份实例提供的是相同的通用服务,如果希望代码主体不变,仅仅更改数据类型,可通过function template达到目的。
2.8、函数指针(pointer to function)
- 定义
函数指针必须指明函数的返回类型及参数列表,函数指针的定义必须将*放在某个位置,表示定义的是指针
//要指向的函数
const vector<int> *fibon_seq(int size);
//函数指针
const vector<int>* (*seq_ptr)(int);
函数的地址可以直接通过函数的名称获得。
关键词enum可以用来定义枚举类型(enumerated type),默认情况下,第一个枚举项的值为0,其后逐渐增加1.
enum nstype{ns_fibon,ns_clus,ne_pell};
2.9设定头文件
头文件的扩展名,习惯上为.h,标准库例外,没有扩展名。
函数定义只能有一份,除了inline函数,为了扩展inline函数,每个调用点上都要获得其定义,所以inline函数的定义放在头文件中;还有const object,const object 只要一出定义文件之外就不可见,所以在多个程序代码中定义,不会互相干扰出错误。
函数在头文件中想要标识为声明,需要在前面加上关键字extern。
头文件如果是<>,表明该头文件被认为是标准的或项目专属的头文件,编译器编译时优先从某些默认的磁盘目录中寻找,如果时“”,此文件便被认为是用户提供的头文件,有先从包含此文件的文件所在磁盘目录找起。
浙公网安备 33010602011771号