c++函数特性

一、内联函数

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++会自动进行匹配,如果匹配不上,尝试强制转换类型进行匹配。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值