本章主要内容:

  • 1)内联函数(替代宏代码段)
  • 2)默认参数
  • 3)占位参数

1.C++的内联函数分析

1.1讲解内联函数之前,首先回忆下之前讲的define宏定义:

之前讲过宏定义会经过预处理器进行文本替换,缺点就在于没有类型检查,没有任何编译过程,编译器根本不知道类型是什么.

所以,C++中,当需要某个类型的常量时,可以使用const常量来替代宏常数,如:

const int A=;      <--->      #define A 3

1.2那如果#define 定义的是宏代码段,例子如下:

#include <stdio.h>
#define MAX(A,B) (A>B?A:B)
int main()
{
int a=;
int b=;
printf("%d",MAX(++a,b));
}

输出结果:

 

这就是宏定义的缺点,因为上面的printf()会被预处理器展开为:

printf("%d", ((++a) > b ? (++a) : b ) );

从而a被加了两次,所以输出结果为7.

1.3所以C++便添加了内联函数来代替宏代码段

内联函数用inline关键字声明,比如上面的MAX(A,B)宏,则可以替换为:

inline int MAX(int a, int b)
{
return a > b ? a : b ;
}

而内联函数和普通函数两者区别:

  • 普通函数:每次调用前,CPU都会保存现场(入栈),调用完后还要恢复现场(出栈)等额外开销.
  • 内联函数:就会在每次调用的地方,将内联函数里的代码段”内联地”展开,所以省去了额外的开销

注意:当内联函数里的代码过多,且流程复杂时,编译器可能会拒绝该函数的内联请求,从而变成普通函数

2.函数的参数默认值

C++中允许为函数提供参数默认值,主要有两种定义方式

1)函数声明时:

int show(int x=); //声明show函数,并定义参数x默认值为10
int main()
{
show();
} int show(int x)
{
printf("x=%d\n",x);
}

输出结果:

x=

2)没有函数声明时:

 int show(int x=)     //定义参数x默认值为10
{
printf("x=%d\n",x);
} int main()
{
show();
}

输出结果:

x=

2.1当有多个默认参数时

1)定义时,参数的默认值必须从右向左定义,例如:

int show(int x, int y,int z=);        //定义正确

int show(int x, int y=,int z=);      //定义正确

//int show(int x=6, int y=8,int z);     //定义错误,没有从右开始定义

//int show(int x, int y=8,int z);       //定义错误,没有从右开始定义

2)调用函数时,参数则从左向右匹配,例如:

#include <stdio.h>
int show(int x, int y=,int z=); int main()
{
show(); //x=6,y=8,z=10;
show(,); //x=6,y=7,z=10;
show(,,); //x=6,y=7,z=8;
return ;
} int show(int x,int y,int z)
{
printf("x=%d y=%d z=%d\n",x,y,z);
}

输出结果:

x=  y=  z=

x=  y=  z=

x=  y=  z=

3.C++函数的占位参数

占位参数,是指该函数的参数只有类型声明,却没有参数名

注意:该占位参数在函数体内是无法被使用的

实例1:

int func(int x,int );

... ...

func(,);   //调用func函数

实例2,使用占位参数+默认参数一起使用:

int func(int =,int =);

... ...

int main()
{
/*调用func函数*/
func();
func();
func(,);
return ;
}

从实例2可以看到,其实占位参数和默认参数主要目的是为了兼容代码

下章接着来学习: 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)

3.C++内联函数,默认参数,占位参数的更多相关文章

  1. const引用和函数占位参数遇上默认参数以及内联函数

    1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了. 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起 ...

  2. c++-内联函数和函数重载和默认参数和函数指针

    内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编 ...

  3. 我的c++学习(6)默认参数和内联函数

    默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...

  4. 特殊用途语言特性——默认参数、内联函数和constexptr函数

    1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 我们可 ...

  5. 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...

  6. C++命名空间、函数重载、缺省参数、内联函数、引用

    一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值null ...

  7. C++中对C的扩展学习新增语法——内联函数以及函数参数

    内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...

  8. c++中函数的参数传递,内联函数和默认实参的理解

    1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...

  9. C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)

    命名空间 概述 在C/C++中,变量.函数和后面要学到的类都是大量存在的,这些变量.函数和类的名称将都存在于全局作用域中,可能会导致很多冲突.使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲 ...

随机推荐

  1. QQ群友在线/离线,如何测试?

    上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使 ...

  2. 算法,java代码实现打印万年历

      万年历 以1900年1月1号星期一为时间原点 星期日 第一天 星期一 第二天 星期二 第三天 星期三 第四天 星期四 第五天 星期五 第六天 星期六 第七天            1.计算出当前日 ...

  3. memcached经典问题和现象

    缓存刷新时间集中问题 某个缓存失效了,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,会造成数据库服务器崩溃 需要将缓存失效时间离散分布在访问量比较低的时间段 multige ...

  4. 网站开启cdn加速的最简单步骤

    https://jingyan.baidu.com/article/fedf0737ac414f35ac897704.html https://su.baidu.com/console/website ...

  5. 如何给网站添加CNZZ站长统计功能代码的常用办法

    前几天有个客户来问小编怎么给网站添加上CNZZ站长统计工具,其实这个很简单,只要把cnzz免费代码复制到我们的footer文件就行.今天小编正好有空就来分享一下具体的操作过程. 首先要想获得这个免费的 ...

  6. Thinkphp5.0+Vue2.0前后端分离框架Vuethink

    VueThink是一套基于Vue全家桶(Vue2.x + Vue-router2.x + Vuex)+ Thinkphp的前后端分离框架. 脚手架构建也可以通过vue官方的vue-cli脚手架工具构建 ...

  7. 关于PHP 开启zlib gzip配置

    一般有两种方法:一种是使用ob_start("ob_gzhandler") ,是开启php自带的zlib配置,这里要说的是后者,此两种方法只能选其一,否则会报错 一.打开php.i ...

  8. [转载]利用memcached在多台服务器之间共享PHP的session数据

    原文地址:利用memcached在多台服务器之间共享PHP的session数据作者:a1049709658 最近我的几篇文章都是是最近项目的一点心得^^ 这个项目一开始就设计的"很大&quo ...

  9. DT_修改注册项

    所用语法: /* */用于注释掉某些非必要的判断语句 修改的文件及路径如下: 前台: 文件路径:/根目录/lang/zh-cn/ 编辑文件:member.inc.php 修改其中一些提示信息(如,将[ ...

  10. Java常用的框架

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...