本章主要内容:

  • 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. 微信小程序开发官方文档解读

    创建页面 在这个教程里,我们有两个页面,index 页面和 logs 页面,即欢迎页和小程序启动日志的展示页,他们都在 pages 目录下.微信小程序中的每一个页面的[路径+页面名]都需要写在 app ...

  2. JS使用循环按指定倍数分割数组组成新的数组的方法

    今天一个新人同事问了我一个问题,就是有一个像下边这种不知道具体长度的数组,想以每4个为一组,重新组合为一个二维数组,很简单的需求只需要用到一个循环再去取余数就可以了,写了一个小demo在这里把代码包括 ...

  3. day2 作业

    1.判断下列逻辑语句的True,False. 1),1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6     ...

  4. 二维数组模拟实现酒店管理系统-java

    业务分析 1.需要一个房间类,包含房间的属性,比如房间编号.房间类型.是否占用. 2.需要一个旅馆类,旅馆有房间,提供的方法需要有 预订房间.打印房间信息.初始化房间.退房. 3.测试类,测试预订房间 ...

  5. mac通过自带的ssh连接Linux服务器并上传解压文件

    需求: 1:mac连接linux服务器 2:将mac上的文件上传到linux服务器指定位置 3:解压文件 mac上使用命令,推荐使用 iterm2 .当然,也可以使用mac自带的终端工具. 操作过程: ...

  6. 积分图实现均值滤波的CUDA代码

    没想到我2010年买的笔记本显卡GT330M 竟然还能跑CUDA,果断小试了一把,环境为CUDA6.5+VS2012,写了一个积分图实现均值滤波.类似于OpenCV的blur()函数. 使用lena. ...

  7. iOS学习之Map,定位,标记位置的使用

    iOS上使用地图比Android要方便,只需要新建一个MKMapView,addSubView即可.这次要实现的效果如下: 有标注(大头针),定位,地图. 1.添加地图 1.1 新一个Single V ...

  8. PostgreSql问题:ERROR: column "1" does not exist

    摘录自:http://blog.csdn.net/shuaiwang/article/details/1807421 在PostgreSQL中,不论是在pgAdmin中还是在命令行控制台里面,在SQL ...

  9. JavaScript总结学习一:js中构造函数与普通函数的区别

    构造函数不仅只出现在JavaScript中,它同样存在于很多主流的程序语言里,比如c++.Java.PHP等等.与这些主流程序语言一样,构造函数在js中的作业一样,也是用来创建对象时初始化对象,并且总 ...

  10. 深入理解HashMap的扩容机制

    什么时候扩容: 网上总结的会有很多,但大多都总结的不够完整或者不够准确.大多数可能值说了满足我下面条件一的情况. 扩容必须满足两个条件: 1. 存放新值的时候当前已有元素的个数必须大于等于阈值 2. ...