1、内联函数

    define 可以定义宏代码片段,但是,C++ 推荐使用内联函数替代宏代码片段。

inline int f(int a, int b)
{
}

    只需要在 函数定义(实现)的前面添加 inline 关键字。内联函数的出现是为了替代宏代码的片段

定义:

    内联函数,其实就会将内联函数的内部直接插入到被调用的地方,所以就没有了,调用子函数的出入栈的操作的开销,一定程度上节约了开销。

优点:

    省去调用的过程,不用出入栈的操作,减少开销,加快运行的速度。

缺点:

    使用一次内联函数,就插入函数,这样程序的体积会变得很大

注意:其实就是拿空间开销和时间开销做替换而已,内联函数牺牲了空间开销节约了时间开销。

内联函数和宏代码段的区别

内联函数的本质上还是一个函数,具有普通之后函数的特征,比如做参数的检查,返回类型等等,内联函数经过编译器处理,直接将代码插入调用的地方。

    宏代码端,是由预处理执行,只是做简单的文本替换,

内联函数的限制

    内联函数的优点是,少了出入栈的操作,节省了开销,但是,当内联函数的运行的开销大于出入栈的开销的时候,这个时候,内联函数就是鸡肋了。所以内联函数还是存在限制的:

    (1)不能存在任何形式的循环语句

    (2)不能存在判断语句

    (3)运行开销大于出入栈的开销,一般的代码行数不超过五行

    (4)不能对函数进行取址的操作

内联函数实现的机制

    编译器发现有内联函数的时候,就将这                

    当发现使用内联函数的时候,首先进行类型检查,将符号表的里面的值,插入到调用的位置。

2、函数默认的参数

    C++ 可以在函数声明的时候为参数提供一个默认值,当函数使用的时候没有指定这个参数的值,那么编译器会自动使用默认的值;

int  f(int a = 1, int b = 1);  // 函数的声明,声明的时候提供默认值
int f(int a, int b) // 函数的定义,
{// 虽然没有对 ab 进行赋值,所以使用的是函数声明时候,提供的默认值
printf("a = %d, b = %d \n",a, b);
}

函数声明提供函数默认参数的规则

int  f(int a, int b = 0, int c = 1);
int f(int a, int b,int c)
{
printf("a = %d, b = %d \n",a, b);
return 0;
}

    规则是,一旦一个函数从某一个开始提供默认值的时候,那么之后所有的默认值都必须进行提供,不然报错,也就是说, 假如例子,从第一个 a 就提供了默认的参数值,那么后面的所有的参数都必须提供默认的参数值。

    调用的时候,f(参数),当参数为一个数值的时候,那么这个数值就会传入给变量 a,当传入两个的时候,就将数值传入给变量a、b;

3、函数的占位参数

    占位参数,就是只有函数的参数的类型的声明,而没有参数的名,比如:

int  f(int a, int b,int)

使用的时候,我们也是必须传入三个参数,但是最后一个参数,是没有被使用到的。

函数占位参数的意义:

    (1)为以后程序的扩展留下一个线索:告诉后面的程序猿,这个地方可以做扩展,

    (2)兼容C语言程序中,出现的不规范的写法,

4、函数的重载(overload)

    使用相同的函数名,完成不同的功能,这个就是重载函数

int  func(int a)
{
return x;
}
int func(int a,int b)
{
return a + b;
} int func(char *s)
{
return strlen(s);
}

    可见,函数名都是完全相同的,但是这个函数,完成了不同的功能。所以他们肯定是有所区分的,区分的手段 : 参数的个数,参数的类型,参数的顺序



问题: 当重载函数遇见函数提供默认的参数

int func(int a,int b,int c = 0)
{
return a + b + c;
}
int func(int a, int b)
{
return a + b;
}
int main()
{
func(1, 2); // 指定哪一个 函数呢
}

    正确的是,编译器会报错,编译器发现了二义性,两个func 都是可以被执行的,编译器也是不了解,

注意:

    函数的返回值,不能作为函数重载的依据,也就是说,函数的重载只能在参数的个数,参数的类型,参数的顺序上做区分。



5、C语言和C++的相互调用



C++ 调用C编写的函数:

    C++的编译器虽然是可以兼容C语言的编译方式,但是C++的编译器会优先使用C++的编译方式,但是,如果想C++ 调用 C语言的函数的话,必须加入 extern 关键字,告诉编译器,这个函数使用C语言的方式进行编译。


extern "c" {内容,比如函数或者头文件}

告诉编译器,内容的部分,可以是声明的函数或者变量使用的是C编译器编译的方式

C调用C++编写的函数:



统一的解决的方案:

    __cplusplus :

    使得C代码可以通过c编译器进行编译,也可以在C++的编译器中,以C的方式进行编译,,

#ifdef __cplusplus
extern "c"
{
#endif
// 函数的声明或者函数的定义
#ifdef __cplusplus
}
#endif

 

 

C++编译器不能以C编译的方式去编译函数重载的问题

    函数的重载,是在C++才有的,所以函数重载的问题,不能以C编译的方式去编译,所以,

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
int func(int a, int b, int c = 0)
{
return a + b + c;
}
int func(int a, int b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif

    以C编译的方式函数重载的话,就肯定会报错,

2、C++ 的升级的更多相关文章

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  2. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

  3. Entity Framework Core 1.1 升级通告

    原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...

  4. ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录

    升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...

  5. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  6. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  7. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  8. 升级npm

    查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...

  9. iOS开发 判断当前APP版本和升级

    从iOS8系统开始,用户可以在设置里面设置在WiFi环境下,自动更新安装的App.此功能大大方便了用户,但是一些用户没有开启此项功能,因此还是需要在程序里面提示用户的 方法一:在服务器接口约定对应的数 ...

  10. AEAI DP V3.6.0 升级说明,开源综合应用开发平台

    AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...

随机推荐

  1. 事务ACID特性,其中I代表隔离性(Isolation)。

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  2. linux系统——机制与策略(三)

    机制与策略 学习系统调用时,书上提到机制与策略,这也是陈老师与武特学长经常给我们强调的,这是一种设计模式,帮助我们理解操作系统的设计.下面的内容是从陈莉君老师的博客上copy下来的,写的很好,很通俗. ...

  3. web常见攻击总结

    1.Sql注入 攻击者把sql命令插入到web表单的输入域或页面请求的查询字符串, 欺骗服务器执行恶意的sql命令 防御措施 前端: 1.正则验证字符串格式 2.过滤字符串的非法字符 后端: 1.不要 ...

  4. 【CCF】URL映射 模拟

    #include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...

  5. 【BZOJ3895】取石子(博弈,记忆化搜索)

    题意: Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个:1:从某堆石子中取走一个2:合并任意两堆石 ...

  6. ThreadPool怎样判断子线程全部执行完毕

    原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 1、先来看看这个 http://hi.baidu.com/handboy/blog/item/160e9697fd ...

  7. LeetCode OJ-- Maximal Rectangle ***@

    https://oj.leetcode.com/problems/maximal-rectangle/ 给一个二维矩阵,里面只有0 1,求一个最大的矩阵,里面的所有元素都是1. 首先预处理: 0 1 ...

  8. Android Studio查看其它APP的布局结构

    概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 (2)运行Android Studio,打开 ...

  9. 透过ReentrantLock窥探AQS

    背景 JDK1.5引入的并发包提供了一系列支持中等并发的类,这些组件是一系列的同步器,几乎任一同步器都可以实现其他形式的同步器,例如,可以用可重入锁实现信号量或者用信号量实现可重入锁.但是,这样做带来 ...

  10. 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)

    前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...