1、C++内联函数
正常在遇到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后调回到地址被保存的指令处!
在使用内联函数后,编译器将使用相应的函数代码替换函数调用,但每执行一次就会产生一个副本,所以会产生一定的内存开销。故如果代码的执行时间很短,内联函数就可节省原来进行函数调用的绝大部分时间。
注意:内联函数是按值传递的,而宏#define 不是按值传递的!
2、引用变量
int rats=101;
int &rodents=rats; //引用,必须在申明引用时将其初始化,不能像指针那样先申明再赋值
int *prats=&rats; //指针
void swapr(int & a,int &b); //引用实参一定要是变量,不能是常量
void swapp(int *p1,int *p2); //
void swap(int a,int b); //值将不会改变,因为变量a,b只是复制了实参的值的新变量,因此原值没有改变。
结构和类传递给函数时通常都是通过引用传递的。
基类引用可以指向派生类对象,而无需进行强制类型转化!
如:ofstream 是ostream类的派生类,ostream &的类型参数可以接受ostream对象。
ofstream fout;
ostream cout;
void file_it(ostream &os,double fo,const fe[],int n);
则file_it(fout,objective,eps,5); //将输入到文本中
file_it(cout,objective,eps,5); //将输入到屏幕上
在修改时:ios::base::fmtflags initial;
initial =os.setf(ios_base::fixed); // 保存修改前的格式
…… os.setf(initial); // 恢复之前的格式
3、默认参数
设置默认值要通过函数原型,且在设置时必须从右到左添加默认值,而实参则按照从左到右的顺序赋给相应的形参。
4、函数重载(函数多态)
函数重载的关键是函数的参数列表--函数特征值,与其他都无关。如:参数引用与未引用是一样的,函数返回的类型也不考虑。
当函数只是参数的个数减少则用默认参数的函数简单些,并且程序也只需为一个函数请求内存;而如果要使用不同类型的参数时,则默认参数便不管用,这时应使用函数重载。
5、函数模板
template <typename T> //也可以换成template<class T>,申明时不需加上分号
void Swap(T&a,T&b)
{
T temp;
temp=a;
a=b;
b=temp;
}
模板也可以重载,具体化显示
具体化优先于常规模板,而非模板函数优先于具体化和常规模板。
具体化声明: template<>void Swap<job>(job &,job&); //<job>是可选的
实例化申明: template void Swap(int ,int ); //不能在同一文件中使用同一种类型的显示实例化课显示具体化。
可对一些类型不匹配的参数在调用时进行实例化,从而强制类型转化。