一、内联函数
1.内敛函数在函数的声明和定义前面都要加上关键字“inline”
2.内联函数是c++为提高程序运行速度所做的一项改进,与常规函数区别在于c++编译器如何将它组合到程序中,
所谓的的“内联”是编译器将使用相应的函数代码来替换函数调用,程序无需跳转到另一个位置执行代码,再跳回来。所以速度比常规函数稍快,但是代价是需要占用更多的内存。如果程序在x个不同的地方调用同一个内联函数,则程序将包含该函数代码的x个副本。下图是常规函数与内联函数调用区别。
3.应该有选择的使用内敛函数,如果函数的执行时间比处理函数调用机制的时间长很多,那么使用内敛函数节约的时间将很小。
4.内敛与宏,C中使用的宏(#define)是内联代码的原始实现,但是不是通过传递参数来实现的,而是通过文本替换
//定义内联函数
inline double square(double x){return x*x}
//定义宏
#define SQUARE(X) ((X)*(X))
int main(void)
{
double a,b,c;
a=1;
b=1;
square(++a); // value is 4
SQUARE(++b); //replace ((++b)*(++b)) value is 9
}
</pre></div><h1>二、引用</h1><div>1.声明引用的时候,使用“&”,&不是地址运算符,而是类型标识符</div><div>int a=10;</div><div>int & b=a;</div><div>b++; // b=11,a=11</div><div>2.引用看上去很像伪装表示的指针,但是还是有区别</div><div><span style="white-space:pre"></span>1)引用必须在声明的时候将其初始化,而不能像指针那样先声明,后赋值</div><div><span style="white-space:pre"></span>2)引用一旦和一个变量关联起来,就将一直效忠于他(类似 const指针)</div><div><span style="white-space:pre"></span>int a=10;</div><div><span style="white-space:pre"></span>int & b=10;</div><div><span style="white-space:pre"></span>int c=20;</div><div><span style="white-space:pre"></span>b=c; //is similar as a=c , value is a=20,c=20, </div><div>3)引用常作为函数的参数使用(特别是参数为一个类的时候),使得被调用函数可以访问调用函数中的参数,并且效率比按值传递高。</div><div><pre name="code" class="cpp">#include <iostream>
using namespace std;
int version1(const int & x,const int & y)
{
return x+y;
}
int & version2(int & x,const int & y)
{
x=x+y;
return x;
}
const int & version3(const int & x,const int & y)
{
int temp=x+y;
return temp;
}
int main()
{
int x=10;
int y=20;
int res=0;
cout<<"version1"<<endl;
cout<<"original x:"<<x<<" y:"<<y<<endl;
res=version1(x,y);
cout<<"add :"<<res<<endl;
cout<<"afteOAoriginal x:"<<x<<" y:"<< y<<endl;
cout<<endl;
x=10;
y=20;
cout<<"version2"<<endl;
cout<<"original x:"<<x<<" y:"<<y<<endl;
res=version2(x,y);
cout<<"add :"<<res<<endl;
cout<<"after deal x:"<<x<<" y:"<<y<<endl;
cout<<endl;
x=10;
y=20;
cout<<"version3"<<endl;
cout<<"original x:"<<x<<" y:"<<y<<endl;
res=version3(x,y);
cout<<"address is "<<&res<<endl;
cout<<"add :"<<res<<endl;
cout<<"after deal x:"<<x<<" y:"<<y<<endl;
x=10;
y=20;
cout<<"original x:"<<x<<" y:"<<y<<endl;
int res2=version3(x,y);
cout<<"res :"<<res<<endl;
cout<<"res2 :"<<res2<<endl;
cout<<"after deal x:"<<x<<" y:"<<y<<endl;
}
本来认为version3函数调用会报错,但是结果却能正确返回???
运行结果:
后面用string来代替int,就可以发现version3不合理的返回
4)引用作为函数返回值的时候,一定要避免返回一个函数终止时候不再存在的内存单元(如临时变量的引用);并且返回的一个可以修改左值(简单理解为能出现在等号左边,可以被赋值的)
#include <iostream>
using namespace std;
int & square(int & x)
{
x=x*x;
return x;
}
int main()
{
int a=10;
square(a)=10;
cout<<a<<endl; //value is 10
}
三、默认参数
1.当函数调用中省略了实参时自动使用的一个值
2.当要为某个参数设置默认值的时候,必须为他右边所有的参数提供默认参数
四、函数重载
1.可以允许多个同名的函数,条件是特征标不一样,(特征标是指参数的数目,类型和顺序)
2.c++会自动进行匹配,如果匹配不上,尝试强制转换类型进行匹配。