2、C++ 的升级


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编译的方式函数重载的话,就肯定会报错,

时间: 2024-10-22 21:43:25

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

ubuntu下卸载python2和升级python3.5

卸载python只需一条语句就可以实现 sudu apt-get remove python ubuntu下安装python3 sudo apt-get install python3 但这样只安装了python3.4 要想使用python3.5,则必须升级python3.4 sudo add-apt-repository ppa:fkrull/deadsnakes sudo apt-get update sudo apt-get install python3.5 使用以上三行命令便可升级py

10.8.5如何升级(app store 出错 请稍后重试 100)

出现问题:苹果以前的老版本,OS X 10.8或是10.8.5在当年提示你升级,你又任性没升级的时候,拖过那阵,你再想升级,就是各种报复.进app store下载或是更新东西都是弹出app stpre 出错,请稍候重试 (100),然后再提示说此系统不支持银联. 现在已经是OS X 10.11了,今天接手了一个老古董,系统才OS X 10.8,按照提示升到了OS X 10.8.5,之后不管怎么点,都没法,百度了一下,10.8.5升级,瞎折腾了好久,网上的方法就一个,搞个安装包.最后还是折腾出来了

最新版勤哲Excel服务器V2016.12.0.292无限用户支持手机APP,微信,网页等功能不绑定电脑,任意安装,支持后续升级

最新版勤哲Excel服务器V2016.12.0.292无限用户支持手机APP,微信,网页等功能不绑定电脑,任意安装,支持后续升级. 这个版本发布过之后,再发布新的版本需要到下个月的中下旬,老朋友可以使用本版本后面延续升级 目前有大约127家用户在用,没有修改过注册授权文件,系统非常成熟,推荐指数为五星,QQ:619920289 麦枫论坛http://www.mfsun.com 简介 EXCEL服务器作为一款客户化.综合性管理软件,它通过Excel就能构造出您自主的管理系统:同时,她也可将您公司现

ubuntu14.04升级以及gitlab升级

环境:系统版本ubuntu14.04 .gitlab-ce.8.11.3 升级要求:系统升级为目前最新的LTS版本的ubuntu16.04.gitlab升级为最新的版本 升级可以有两种方案: 一种类似于迁移(重新找台机器,系统直接安装ubuntu16.04,然后安装gitlab版本和原版本一致,进行数据迁移后确认数据无误后再对gitlab进行升级). 另一种直接在原机器上,首先对系统升级,然后对gitlab升级. 1.直接在原机器上升级的方案: 升级前备份数据: 停止gitlab备份数据 git

QQ群认证 人数再度扩容 权限随之升级

群排名,得资源得天;之于排名,群容量有杠杆意义. 而今,流量分散,打法完全无法集中,全平台战略,越发凸显.QQ群,已是必争之地. 去年,Q群霸屏春天,一切那么顺其自然;而今,除了拼资源,还是拼资源.除去小号资源,于等级之外,认证一出,必须拿下. 认证QQ群有什么用? 为毛要认证,就凭你随便呱唧几句?说得这么流弊,认证QQ群具体有哪些用处? 1.认证标识,犹如QQ空间的认证,一个加V的标识,凸显权威性官方性. 2.在群检索中,搜索权重会自带光环(高高的),平台会予以很好的排名,这个是申请者核心诉求

python升级安装后的yum的修复

升级python版本号后,执行yum # yum -y install openssl 提演示样例如以下: There was a problem importing one of the Python modules required to run yum. The error leading to this problem was: No module named yum Please install a package which provides this module, or veri

穿越300km沙漠:卡萨帝用7星服务做实体经济升级样板

3月31日,家住新疆克拉玛依戈壁沙漠"无人区"公路守护站的刘女士购买了1台卡萨帝洗衣机,在第2天中午,卡萨帝服务工程师就将洗衣机准时送达用户家.穿越300多公里的沙漠公路.冒着零下20多度的严寒,安装师傅的汽车也已经被沙石砸损,刘女士不禁为卡萨帝的七星级服务标准竖起大拇指,而这只是卡萨帝七星级服务的其中一个缩影.其背后,是由卡萨帝完备的服务链条作为支撑的7星级高端服务体系. 七星级服务:基于传统服务的"超级服务" 在过去的很长一段时间里,产业对"服务&qu

entos上PHP5.3升级到PHP5.4及更高版本方法

yum配置 执行命令下载.安装yum源,当前是针对Centos6并且64位版本的源: [[email protected]_249 yum.repos.d]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm[[email protected]_249 yum.repos.d]# rpm -ivh ht yum配置执行命令下载.安装yum源,当前是针对Centos6并且64位版本的

ActiveReports 6:如何升级旧版本的项目

如果现在的项目使用的是ActiveReports for .NET 3.0,那么有两种升级方式: 一是使用ActiveReports 6.0附带的转换工具(参见下面"升级ActiveReports for .NET 1.0 或2.0项目"): 二是在Visual Studio中打开工程,用新版本的DLL替换掉旧版本的DLL引用,并且修改代码的编译错误. 替换工程的DLL引用 在Visual Studio中打开需要升级的报表工程. 在解决方案资源管理器中,点击"显示所有文件&q

openssl、openssh升级

近期公司应用需要用到https协议:Centos6.5自带的的openssl 1.0.1e版本存在名为"心脏出血"的漏洞. 环境:CentOS6.5_x86_64 准备相关的包openssh下载地址:http://mirror.internode.on.net/pub/OpenBSD/OpenSSH/portable/openssl相关包下载:http://www.openssl.org/source/pam相关包下载:http://pkgs.org/centos-6/centos-x