一,内联函数

1.内联函数的概念

  C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10。那么C++中是否有什么解决方案来替代宏代码片段呢?C++中推荐使用内联函数代替宏代码片段,C++中使用inline关键字声明内联函数。注意:内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

2.内联函数示例

# include<iostream>
using namespace std; /* 宏定义函数方式 */
# define FUN1(a,b) ((a)<(b)?(a):(b)) /* 内联定义函数方式 */
inline int FUN2(int a,int b)
{
return a < b ? a : b;
} int main()
{
int a = ;
int b = ; // 宏定义方式的时候是在预编译阶段直接替换,++a<b?++a:b,因此此时返回的c是3(执行了两次++)
// int c = FUN1(++a, b);
// 内联函数方式是在编译阶段将函数体直接插入到调用的地方,最终生成的代码是没有函数定义的
int c = FUN2(++a, b); printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c); return ;
}

 3.内联函数的说明

  • 内联函数在最终生成的代码中是没有定义的。
  • 内联函数由编译器处理,直接将编译后的函数体插入在函数调用的地方。而宏代码片段是由预处理器处理,进行简单的文本替换,没有任何编译过程。
  • 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回),内联函数具有函数的特征(参数检查,返回类型)。
  • 现代的C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译。C++编译器不一定准许函数的内联编译请求。
  • 内联编译限制:不能存在任何形式的循环语句,不能存在过多的条件判断语句,函数体不能过于庞大,不能对函数进行取地址操作,函数内联声明必须在函数调用之前。

二,默认参数

1.默认参数实例

  C++中可以在函数定义时为函数参数设置默认值,当在进行函数调用的时候,如果没有指定这个参数的值,编译器会自动用默认值替换。

# include<iostream>

using namespace std;

void print(int a = )
{
cout << "a = " << a << endl;
} int main()
{
// 默认参数 打印结果: a = 3
print();
// 传递函数参数 打印结果: a = 5
print(); return ;
}

2.默认参数的规则

  当函数的参数中使用了默认参数,那么该参数后面的参数只能为默认参数,而不能为普通参数(因为在函数调用的时候,无法明确要传递的参数)。

三,占位参数

1.函数占位参数实例

  C++中占位参数只有参数类型的声明,而没有参数的名称,一般情况下,在函数体内无法使用占位参数。

# include<iostream>
using namespace std; /* 函数占位参数 */
void test(int a, int b, int)
{
cout << "a = " << a << ",b = " << b << endl;
} int main()
{
// 调用含有占位参数的函数时,函数参数个数必须匹配,必须用3个参数而不是2个
test(, , ); return ;
}

2.占位参数和默认参数结合使用

  如果占位参数和默认参数结合使用,则在函数调用的时候可以传递该占位参数也可以不传递该占位的值。其意义是为了以后程序的拓展留下线索,同时兼容C语言的一些不规范语法。

# include<iostream>
using namespace std; /* 函数占位参数和默认参数结合 */
void test(int a, int b, int = )
{
cout << "a = " << a << ",b = " << b << endl;
} int main()
{
// 当函数占位参数和函数默认参数结合在一起的时候,我们调用函数的参数列表就可以传2个或者3个参数了
test(, );
test(, , ); return ;
}

四,函数的重载

1.函数重载的概念

  所谓的函数重载就是用同一个函数名,定义不同的函数。

2.函数重载的规则

  1.函数的名称必须一致。

  2.函数的参数个数不同。

  3.函数参数的类型不同。

  4.函数参数的类型顺序不一致。

3.函数的返回值是否是函数重载的判断标准?

   答案是否,函数的返回值不能够作为函数重载的标准,例如我们定义一个简单的函数void fun()和int fun(),当我在main()函数中调用fun();编译器无法判断是调用的第一个还是第二个,存在二义性,因此会报错。

C++对C的函数拓展的更多相关文章

  1. C++学习笔记-C++对C语言的函数拓展

    内联函数 内联函数是指用inline关键字修饰的函数.在类内定义的函数被默认成内联函数.内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质 inline关键字只是给编译器一个建议,编译 ...

  2. C++对C的函数拓展 - 占位参数

    函数占位参数 占位参数只有参数类型声明,而没有参数名声明 一般情况下,在函数体内部无法使用占位参数 demo #include <iostream> using namespace std ...

  3. C++对C的函数拓展 - 默认参数

    1 C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 void myPrint(int x = 3) { printf("x:%d& ...

  4. HDU 3501【欧拉函数拓展】

    欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...

  5. fork函数拓展

    1.fork之后父子进程共享文件:文件引用计数的值改变,共享偏移. 在下面的例子中test.txt为parentchil.如果子进程没有睡眠,两个进程交叉执行,内容不可预测. 1 #include&l ...

  6. 【Excel】【Salesforce】函数拓展

    1.if 2.vlookup

  7. es6入门3--箭头函数与形参等属性的拓展

    对函数拓展兴趣更大一点,优先看,前面字符串后面再说,那些API居多,会使用能记住部分就好. 一.函数参数可以使用默认值 1.默认值生效条件 在变量的解构赋值就提到了,函数参数可以使用默认值了.正常我们 ...

  8. Javascript函数节流

    最近在做网页的时候有个需求,就是浏览器窗口改变的时候需要改一些页面元素大小,于是乎很自然的想到了window的resize事件,于是乎我是这么写的 <!DOCTYPE html> < ...

  9. [JS] 面向对象的5种写法和拓展JS对象的写法

    面向对象的JAVA  最开始当然是对象的定义了 收集了以下的五种写法 //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; C ...

随机推荐

  1. EasyMesh - A Two-Dimensional Quality Mesh Generator

    EasyMesh - A Two-Dimensional Quality Mesh Generator eryar@163.com Abstract. EasyMesh is developed by ...

  2. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  3. 通往全栈工程师的捷径 —— react

    腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...

  4. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  5. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  6. Coroutine in Java - Quasar Fiber实现--转载

    转自 https://segmentfault.com/a/1190000006079389?from=groupmessage&isappinstalled=0 简介 说到协程(Corout ...

  7. 普通程序员如何转向AI方向

    眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...

  8. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  9. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  10. 张高兴的 UWP 开发笔记:横向 ListView

    ListView 默认的排列方向是纵向 ( Orientation="Vertical" ) ,但如果我们需要横向显示的 ListView 怎么办? Blend for Visua ...