初学C++

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

 

  1. 内联函数

 函数前面加上inline 关键字

 1.内联函数调用原理

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



LeetCode刷题基础(使用C++)_C++

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


LeetCode刷题基础(使用C++)_C++


 

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

 

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 }


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

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

更多代码示例:



LeetCode刷题基础(使用C++)_C++

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 */


LeetCode刷题基础(使用C++)_C++


 

3.缺省参数列表

 

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

示例代码:



LeetCode刷题基础(使用C++)_C++

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 */


LeetCode刷题基础(使用C++)_C++


 

下面是会报错的代码



LeetCode刷题基础(使用C++)_C++

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");

}


LeetCode刷题基础(使用C++)_C++


 

 

 

4.哑元函数

 

示例代码如下:



LeetCode刷题基础(使用C++)_C++

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

}

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

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

}


LeetCode刷题基础(使用C++)_C++


 

哑元函数的意义:

为了兼容老版本:

举例:假如我写了一大堆的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 全都删去,只需修改定义函数的那以块地方就行了。