C++中对C语言在函数使用方面做了很大的升级

一﹑内联函数

1.C++中推荐使用内联函数来替代宏片段代码

2.C++中使用关键字inline声明内联函数

例如:

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

需要注意的地方:

a.内联函数声明时inline关键字必须和函数体定义的地方结合在一起,否则编译器会忽视内联请求

b.当然如果在声明的时候对进行一些处理,那么编译器还是可以对函数的进行内联请求的,声明的时候需要加上 __attribute__((always_inline))

c.内联函数虽然是对代码进行替换,但是是有参数检查的,所以这是在编译阶段进行的,要区别于宏(与编译阶段进行)

3.内联函数编译的限制

a.不能存在任何形式的循环语句

b.不能存在过多的条件判断

c.函数体不能过于庞大

d.不能对函数进行取址操作

e.内联函数的使用之前必须声明

二﹑函数的默认参数

1.C++在对函数进行声明的时候可以指定函数参数的默认值,举例如下

#include <iostream>

using namespace std;

int add(int i = 1,int j = 2);

int main(void)
{
int result = 0 ;
result = add(1,1);
cout<<"i + j ="<<result<<endl;
result = add();
cout<<"i + j ="<<result<<endl;
return 0;
} int add(int i,int j)
{
return i+j;
}

下面的例子是一样的

#include <iostream>

using namespace std;

int add(int i = 1,int j = 2)
{
return i+j;
} int main(void)
{
int result = 0 ;
result = add(1,1);
cout<<"i + j ="<<result<<endl;
result = add();
cout<<"i + j ="<<result<<endl;
return 0;
}

注意的地方:

a.一旦在一个函数调用中开始使用默认参数值,,那么这个参数后的所 那么这个参数后的所
有参数都必须使用默认参数值

b.占位参数只有参数类型声明,,而没有参数名声明,占位参数只为功能扩展所用(个人理解)

三﹑函数的重载

1.函数重载的特点

a.用同一个函数名定义不同的函数

b.当函数名和不同的参数搭配时函数的含义不同

c.当返回值类型不同的时候,不能看作函数重载(函数返回值不能作为函数重载的依据)

2.函数指针遇到函数重载会怎样做呢?  看一个实例

#include <iostream>

using namespace std;

int fun(int a)
{
int m = a;
cout<<"m = "<<m<<endl;
} int fun(int a,int b)
{
int m = a + b;
cout<<"m = "<<m<<endl;
} int fun(int a,int b,int c)
{
int m = a + b +c;
cout<<"m = "<<m<<endl;
} int main(int argc,char* argv[])
{
typedef int(*FUN)(int);
typedef int(*FUN1)(int,int);
typedef int(*FUN2)(int,int,int);
FUN p = fun;
FUN1 p1 = fun;
FUN2 p2 = fun;
p(1);
p1(1,1);
p2(1,1,1);
return 0;
}

打印的内容如下:

m = 1
m = 2
m = 3

所以可以总结出:

根据重载规则挑选与函数指针参数列表一致的候选者

严格匹配候选者的函数类型与函数指针的函数类型

这是编译器在编译的时候进行的.

四﹑C和C++的互相调用

当在进行大项目开发的时候,我们经常能够碰到这样的问题,有些组员使用的C开发的,而有的组员使用的是C++开发的,那么我们如何实现C和C++的互相调用呢?

虽然C++编译器能够兼容C语言的编译方式,,但但C++编译器
会优先使用C++的方式进行编译
利用extern关键字强制让C++编译器对代码进行C方式编译

【C++第二课】---C到C++的函数升级的更多相关文章

  1. CI(CodeIgniter)框架入门教程——第二课 初始MVC

    本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...

  2. OpenCV 第二课 认识图像的存储结构

    OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...

  3. 【第二课】深入理解Handler

    简要讲解Handler是做什么的 我们知道,在Android中,app启动会启动一个进程一个线程——UI线程,UI线程是主线程,并且不允许这个线程阻塞超过5秒,一旦超过5秒就会ANR. 所以较为耗时的 ...

  4. Spark 3000门徒第二课scala面向对象总结

    昨晚听了王家林老师3000门徒spark系列课程的第二课,讲述了scala面向对象知识,并且带着过了一遍Spark核心类:SparkContent,RDD的代码,下面写一下心得: RDD是抽象类,实现 ...

  5. 过拟合/欠拟合&logistic回归等总结(Ng第二课)

    昨天学习完了Ng的第二课,总结如下: 过拟合:欠拟合: 参数学习算法:非参数学习算法 局部加权回归 KD tree 最小二乘 中心极限定律 感知器算法 sigmod函数 梯度下降/梯度上升 二元分类 ...

  6. 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

    内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...

  7. 【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!

    内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...

  8. 【C语言探索之旅】 第二课:工欲善其事,必先利其器

    内容简介 1.课程大纲 2.第一部分第二课:工欲善其事,必先利其器 3.第一部分第三课预告:你的第一个程序 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...

  9. Octave Tutorial(《Machine Learning》)之第二课《数据移动》

    第二课 Moving Data 数据移动 常用内置函数 (1)加载文件 load 文件名.dat(或load('文件名.dat')) 接着输入文件名便可查看文件里的数据 (2)显示当前工作空间的所有变 ...

  10. 如何用webgl(three.js)搭建一个3D库房-第二课

    闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...

随机推荐

  1. Eclipse中设置条件断点

    1.在要添加断点的变量那一行前双击,添加断点: 2.在该断点处点击鼠标右键,在弹出的选项卡中选择“断点属性”Breakpoint Properties; 3.在断点属性选项卡中勾选Enabled复选框 ...

  2. JS函数的属性

    1.arguments.callee //经典的阶乘(递归)函数 function factorial(num) { if (num <= 1) { return 1; } else { ret ...

  3. C# json Helper

    using System; using System.Collections.Generic; using System.Data; using System.Text; namespace Comm ...

  4. Linux系统编程(11)——进程间通信之有名管道

    管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以 ...

  5. Difference Between Mod_Python & Mod_Wsgi | eHow

    Difference Between Mod_Python & Mod_Wsgi | eHow     x    YES    NO    Why not?     Thanks for he ...

  6. OpenGL进阶(十一) - GLSL4.x中的数据传递

    in out 对于 vertex shader,每个顶点都会包含一次,它的主要工作时处理关于定点的数据,然后把结果传递到管线的下个阶段. 以前版本的GLSL,数据会通过一些内建变量,比如gl_Vert ...

  7. Unity扩展 四种Menu的区别

    [MenuItem("Tools\AddColor")] :  在Unity菜单中添加一种快捷,执行public static方式 [AddComponentMenu(" ...

  8. iOS SDK原生JSON解析

    - (IBAction)touchReadButton:(id)sender { NSData *jsonData = [[NSData alloc] initWithContentsOfFile:J ...

  9. VF(动态规划)

    VF 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Vasya is the beginning mathematician. He decided to make a ...

  10. nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

    Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Wi ...