Sakura

sakura

博客园 首页 新随笔 联系 订阅 管理

2019/5/13 

  个人说明:这是我第一次写博客文章,主要是试写,写的不好请谅解。

初学C++

下面是关于函数部分的学习
  1. 内联函数
  2. 默认参数列表
  3. 缺省参数列表
  4. 哑元函数

 

  1. 内联函数

 函数前面加上inline 关键字

 1.内联函数调用原理

编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到另一个地址(函数的地址),并在函数结束时返回。下面更详细地介绍这一过程的典型实现。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似)。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销

1 写法如下:
2  
3 inline int plus(int a,int b)
4 {
5     
6       return a+b;
7 
8 }

 

下面这个宏定义和内联函数的区别是看别人写的博客的:

 

1.内联函数与宏定义的区别
C语言使用预处理器语句#define来提供宏。如下例所示:
#define SQUARE(X) X*X
宏定义时通过文本替换开实现的--X是参数的符号标记。
a = square(5.0);->a=5.0*5.0;
b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
d = square(c++);->d=c++*c++
可以看出,对于b,需要使用括号才能正常运算。
#define SQUARE(X) ((X)*(X))
对于c,却仍递增了两次。
因此,宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常。

 

什么时候使用内联函数呢?

说简单点,就是那种操作数量非常少的,而又封装成为函数的函数前使用。我把它理解为杀鸡焉用牛刀。就是说我函数内部的操作本来就是非常快的,而我调用函数这个步骤会耗费一点时间,比如说,我写了100个函数,或者10000个函数,在这之中要寻找和调用就会耗费一点点时间,为了最求速度,使用inline

如果执行函数代码的时间比处理函数调用机制的时间长,则节省的时间占比很小。若代码执行时间很短,则内联函数就可以节省函数调用的时间。

 

 

2.默认参数列表:

1 int info(int a=10,int b=20,int c=30)
2 {
3     return a+b+c;
4 }

对于一个函数,如果我调用的时候没有创参,就传入默认参数列表里的参数

注意:这里的参数是从左到右进行匹配,并且每一个参数都要赋值,如果缺省,情况在下面我会写到。

更多代码示例:

 1 void foo(char a='b',int b=2,const char* c="xY")
 2 {
 3      std::cout<<a<<","<<b<<","<< c<<endl;
 4 }
 5 
 6 /*
 7 
 8   注意这里的参数必须写满
 9 
10 */

 

3.缺省参数列表

 

为函数指定默认值,参数从左往右匹配,因此,缺省参数必须从有开始设置

示例代码:

 1 void bar(char a,int b,const char*c="XY")
 2 {
 3     cout<<a<<","<<b<<","<<c<<endl;
 4 }
 5 
 6 /*
 7 
 8    你的参数如果缺省,从前面开始缺,后面的默认参数要连在一起
 9 
10 
11 */

 

下面是会报错的代码

void bar(char a='b',int b,const char*c)
{
    cout<<a<<","<<b<<","<<c<<endl;
}

/*
   记忆与理解:
  由于参数是从左边到右边进行匹配的。看下面,调用bar(3,"4"),这样 3就赋值给 字符a,

 中间的b,和 c怎么分配?
 因此,规定,默认参数从右边往左边写



*/

int main(void)
{

    bar(3,"4");

}

 

 

 

4.哑元函数

 

示例代码如下:

void func(int,int b,int)
{
     cout<<b<<endl;

}

int main(void)
{
     func(1,2,3);

//传参一个都不能少,必须和参数申明的个数一样

}

 

哑元函数的意义:

为了兼容老版本:

举例:假如我写了一大堆的func 类似的函数 比如   声明时是  func(int a,int b,int c),  目的是返回 a+b+c

但是后来我返回了,我只有返回 b,返回值只和b 有关,这样我可以在函数的定义那里改动,改为 func(int b),

但是这样 我在 main函数里面,凡是调用了  func(a,b,c),的函数,我也要改成 func(b)。

这样是不是很麻烦? 哑元函数的话就不用在 main 函数里修改了,直接把声明的 法a,c 全都删去,只需修改定义函数的那以块地方就行了。

 

本人学生,第一次写博客,可能解释的不够专业,或者说的不到位,欢迎各位指出我的错误。

 

posted on 2019-05-13 22:35  .geek  阅读(1259)  评论(0编辑  收藏  举报