【C++ grammar】重载、内联、变量作用域、带默认参数的函数
目录
- 1、变量的作用域
- 1. 变量的作用域分类
- 2. Unary Scope Resolution (一元作用域解析运算符)
- 2、重载函数
- 3、带有默认参数值的函数
- 4、重载函数 VS 带有默认参数值的函数
- 5、内联函数(Inline Function)
- 1. 普通函数的优缺点
- 2. 使用内联函数
- 3. 定义内联函数
- 4. 内联函数的使用
- 5. 将内联函数的声明和定义分离
- 6. 内联函数使用限制
1、变量的作用域
1. 变量的作用域分类
a. 全局作用域:全局变量
b. 局部作用域:局部变量
局部作用域可以分为:文件作用域、函数作用域以及函数内部的块作用域。
如果外部代码块与其内嵌代码块有同名的变量,那么会产生同名覆盖这种现象。此时要遵循“就近原则”来判断哪个同名变量起作用
例如下面func2中,for循环中又定义了一个i,在运行sum+=i;
时根据就近原则,选择for定义的i,而不是一开始定义的i。
在cout中的i是一开始定义的i,因为已经跳出for循环了。
2. Unary Scope Resolution (一元作用域解析运算符)
If a local variable name is the same as a global variable name, you can access the global variable using ::globalVariable. (局部变量名与全局变量名相同时,可使用 :: 访问全局变量,要定义在主函数外部)
The :: operator is known as the unary scope resolution.(:: 这个运算符被称为一元作用域解析运算符)
#include <iostream>
int v1 = 10;
int main() {int v1 = 5;std::cout << "local variable v1 is " << v1 << std::endl;std::cout << "global variable v1 is " << ::v1 << std::endl;return 0;
}
2、重载函数
重载函数是在同一个名字空间中存在两个或者多个具有相同名字的函数所构成的语法现象。
调用重载函数的语句,是由编译器在编译期确定的。
编译器判断某个函数调用语句所对应的重载函数时,判断依据是函数参数的类型、个数和次序。
如果编译器无法判定,就会报告二义性错误。
3、带有默认参数值的函数
函数的参数可以指定默认值。
指定默认值时,要保证带有默认值的参数要位于函数参数列表的右侧。
如下:
调用带有默认参数值的函数时,如果不指定带有默认值的参数,则该参数自动被赋为默认值。且调用的时候应该实参前置。
C++规定(C++03/C++11): A default argument shall not be redefined by a later declaration (not even to the same value). (函数重定义/声明时,不允许重定义默认参数)
int Add (int a, int b = 3); // 原型声明
int Add (int a, int b = 3) { // 错误!不能重定义默认参数值,
// 尽管与原型声明相同
}
如下:
#include <iostream>
void printArea(double radius = 1);
int main()
{printArea();printArea(4);return 0;
}
void printArea(double radius)
{std::cout << "Area is " << radius*radius*3.14 << std::endl;
}
4、重载函数 VS 带有默认参数值的函数
此时不能判断调用的是哪个函数。
5、内联函数(Inline Function)
1. 普通函数的优缺点
1.1. Pros(优点): 易读易维护
1.2. Cons (缺点): 调用时有开销
函数调用时:参数及部分CPU寄存器的内容进栈,控制流跳转
函数返回时:返回值及寄存器值出栈,控制流跳转
2. 使用内联函数
目的:减小函数调用开销
方法:代码插入到调用处
结果:导致程序变大
3. 定义内联函数
定义函数时,在函数类型前面加上 inline 关键字,则该函数就成为内联函数。
一般而言,内联函数的声明和定义都在一起。我们很少将内联函数的声明和定义分开编写。
// 定义内联函数inline int max (int a, int b) {return (a > b ? a : b);}
// Calling (调用内联函数)int x = max (3, 5);int y = max (0, 8);// Inline expansion(内联展开)int x = (3 > 5 ? 3 : 5);int y = (0 > 8 ? 0 : 8);
4. 内联函数的使用
编译器在遇到内联函数的调用时,会将内联函数的函数体展开到调用位置,从而避免函数调用的开销。
一般来说,内联函数只有在需要考虑程序运行性能的环境中才使用。
程序员所用的 inline 关键字,只是对编译器的一个请求。内联函数是否展开,是由编译器决定的。
5. 将内联函数的声明和定义分离
在C++标准7.1.2.4节有如下说明
An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case (3.2). [ Note: A call to the inline function may be encountered before its definition appears in the translation unit. —end note ]
内联函数应在每个翻译单元中定义。在该翻译单元中它遵循“单一定义规则(ODR)”,并且所有该内联函数定义必须完全相同。[注释:在翻译单元中可能会在内联函数定义出现之前就有调用该内联函数的语句]
因此,内联函数声明和定义分类的用法如下:
#include <iostream>inline void foo();int main() {foo();}inline void foo() {std::cout << "Hi\n";}
6. 内联函数使用限制
适用于频繁调用的短函数 不适用于多处调用的长函数
内联函数只是一种编译机制
inline是对编译器的请求,而不是命令
大多数编译器并不把带有循环、递归、静态变量或者代码较多的函数进行内联编译
【C++ grammar】重载、内联、变量作用域、带默认参数的函数相关推荐
- c语言带默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
(文章来源:嵌入式时代) 使用C++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() 函数 ...
- c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
描述 (文章来源:嵌入式时代) 使用C++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() ...
- 带默认参数值的函数 内联函数
内联函数: 如果在声明函数时使用关键字inline,编译时会在调用处直接用函数体进行替换,而不是调用函数 既然是直接替换,那么里面肯定不能有循环语句,switch语句等 注:①内联函数可以避免函数调用 ...
- C++默认参数与函数重载
C++默认参数与函数重载 一.默认参数 在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数 ...
- python四个带 key 参数的函数(max、min、map、filter)
四个带 key 参数的函数: max()点击查看详细 min()点击查看详细 map()点击查看详细 filter()点击查看详细 1)max(iterable, key) key:相当于对可迭代对象 ...
- tcl脚本学习十一:proc应用 (带默认参数)
lesson 11 : proc应用 (带默认参数) 1.//使用过程的时候,不一定输入所有的参数值.过程的输入参数可以有默认值.默认值由 {默认参数名 默认值}指定.如果调用过程时没有指定这些参数的 ...
- boost::gil模块实现带默认参数的框过滤器的测试程序
boost::gil模块实现带默认参数的框过滤器的测试程序 实现功能 C++实现代码 实现功能 boost::gil模块实现带默认参数的框过滤器的测试程序 C++实现代码 #include <b ...
- C++(13)--函数的进阶:内联、传递引用、参数默认值、重载、函数模板
模块化编程--函数的进阶 1.内联函数 1.1 inline基本情况 1.2 inline 的前世今生-带参的宏替换 2.传递引用(重点) 2.1引用.理由.注意事项 2.3 交换两个变量的数值 3. ...
- 内联函数、默认参数和函数占位参数
内联函数 定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处.编译时,类似宏替换,使用函数体替换调用处的 ...
最新文章
- QT ToolBar 工具栏浮动状态
- 爱因斯坦为什么不是普通人?看他怎么喝茶就明白了,差距太明显了!没法比.......
- 牛客网C++面经 类和数据抽象
- Arduino笔记-有源蜂鸣器结合开关(多瑞咪发声)
- linux 日志 转存,如何记录linux终端下的操作日志(转)
- hashmap扩容机制_图文并茂,HashMap经典详解!
- CvvImage.h和CvvImage.cpp
- 给初学者的RxJava2.0教程(三)
- intellij idea 2016.3.5 控制台取消行数限制
- java选择题库_java选择题库
- c语言求45678所有非平凡因子,近世代数基础习题课答案到第二章9题
- SSD目标检测网络模型详细介绍
- 了解腾讯云云支付CPay特性及应用场景
- 格创东智获《互联网周刊》2020工业互联网平台TOP12 解决方案提供商TOP16
- ubuntu 安装ttf-mscorefonts-installer
- iphone手机safari浏览器访问网站滚动条不显示问题解决办法
- LumaQQ启动脚本
- Elastix 2.5 PBX服务器安装配置使用手册
- 物联网技术的应用领域
- 2020 AAAI-GMAN: A Graph Multi‐Attention Network for Traffic Prediction阅读笔记(翻译)