【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是对编译器的请求,而不是命令

大多数编译器并不把带有循环、递归、静态变量或者代码较多的函数进行内联编译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、像素运算

一、相关概念 1、算术运算 Ⅰ加减乘除 Ⅱ调节亮度 Ⅲ调整对比度 2、逻辑运算 Ⅰ与或非 Ⅱ遮罩层控制 二、图像算术运算(加减乘除均值方差) 其中图像的加减乘除需要保证两张图像的大小相同 import cv2 import numpy as npdef add(src1,src2):dst cv2.add(src1,src2)cv2.im…

Chaikin Curve(球面插值)

在两条折线间完成平滑的过渡是 用画布做UI 或者做类似地图编辑器一类的工作的 很常见的任务。 怎么样化方为圆是决定工作效率的很重要的因素。&#xff08;当需要编辑的曲线多起来&#xff0c; 复杂起来的时候&#xff0c;这会是件相当繁重的工作&#xff09; 最容易想到的莫非…

六、ROI和泛洪填充

一、ROI ROI&#xff1a;region of interest&#xff0c;即感兴趣区域。 一般主要通过numpy来获取ROI 将某区域转变为灰色图片再覆盖原图像 import cv2 import numpy as npsrc cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow(&quo…

django 静态数据_如何在Django中使用静态数据?

django 静态数据Static Data means those data items that we cannot want to change, we want to use them as it is like audio, video, images, files etc. 静态数据是指我们不想更改的数据项&#xff0c;我们想像音频&#xff0c;视频&#xff0c;图像&#xff0c;文件等那…

Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)

目录题目1、层序法&#xff1a;2、递归法&#xff1a;1、先序遍历&#xff08;中左右&#xff09;2、后序遍历&#xff08;左右中&#xff09;3、递归中序遍历为什么不行&#xff08;左中右&#xff09;3、迭代法&#xff1a;1、先序遍历2、中序遍历3、后序遍历为什么迭代法的中…

一款jQuery立体感动态下拉导航菜单特效

一款jQuery立体感动态下拉导航菜单特效,鼠标经过&#xff0c;在菜单栏上方下拉出一个背景图片&#xff0c;效果十分不错的一款jquery特效。 对IE6都是兼容的&#xff0c;希望大家好好研究研究。 适用浏览器&#xff1a;IE6、IE7、IE8、360、FireFox、Chrome、Safari、Opera、傲…

七、模糊操作

一、模糊操作基本原理 1&#xff0c;基于离散卷积 2&#xff0c;定义好每一个卷积核 3&#xff0c;不同卷积核得到不同的卷积效果 4&#xff0c;模糊是卷积的一种表象 二、1*3卷积核举例 每次右移一格&#xff0c;进行对应相乘再求和。1*3的卷积核左右两边的元素并没有处理而…

LeetCode 100. 相同的树 思考分析

给定两个二叉树&#xff0c;编写一个函数来检验它们是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入: 1 1 / \ / 2 3 2 3 [1,2,3], [1,2,3]输出: true 示例 2: 输入: 1 1 / 2 2 [1,2], [1,null,2]输…

八、边缘保留滤波(EPF)

一、概念 边缘保留滤波(EPF,edge preserving filtering) 二、高斯双边 cv2.bilateralFilter(image,0,100,15)100为差异&#xff0c;15为周围的区域 import cv2 import numpy as npdef bilateralFilter(image):dst cv2.bilateralFilter(image,0,100,15)cv2.imshow(bilater…

九、图像直方图

一、图像直方图的属性 说白了就是将图像上的各个颜色通道上的像素点的像素值进行统计&#xff0c;例如&#xff1a;像素值为14的像素点个数有几个&#xff0c;进行显示。 图像的像素值取值范围为[0,255]&#xff0c;这个范围也成为直方图的range也就是直方图的横坐标轴 每一个…

BIFR的完整形式是什么?

BIFR&#xff1a;工业和金融重组委员会 (BIFR: Board of Industrial and Financial Reconstruction) BIFR is an abbreviation of the Board of Industrial and Financial Reconstruction. It was an organization of the Government of India and a branch of the Department …

LeetCode 101. 对称二叉树 思考分析

题目 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ 2 2 / \ / 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ 2 2 \ 3 3 进阶&#xff1a; 你可以运用递归和迭代两种方法解决这个…

直方图反向投影

通过直方图反向投影&#xff0c;根据目标衣服颜色的特征来进行定位 cv2.calcHist([roi_hsv],[0,1],None,[32,48],[0,180,0,256])其中[32,48]表示bin的个数&#xff0c;可以修改&#xff0c;当然范围越小越精确 import cv2 import numpy as np from matplotlib import pyplot …

LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)

目录104. 二叉树的最大深度559. N叉树的最大深度111. 二叉树的最小深度之前的笔记中&#xff0c;已经用层序遍历解决过这个问题了现在试着用深度的解法去求解104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径…

十、模板匹配

一、概念 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 需要首先给定一个模板图像A&#xff0c;和一个待检测图像B。 在待检测图像B上&#xff0c;从左往右&#xff0c;从上往下计算待检测图像B和模板图像A所重叠的匹配度&#xff0c;匹配度越高则两者相同的可…

基于WF的意见征集4(浅析)

接口项目&#xff1a;IClass&#xff08;项目名称&#xff09; HTHuiFuusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Workflow.Runtime;using System.Workflow.Activities;namespace IClass{ /// <summary> /…

那些VisualStudio隐藏的调试功能

VisualStudio是一个强大的调试工具&#xff0c;里面很多隐藏功能少有人问津&#xff0c;但是在特定场景可以节省你很多时间&#xff0c;本文主要介绍一些VisualStudio调试相关的隐藏功能&#xff0c;欢迎大家补充。 运行到指针(Run to cursor) 大多数人用Visual Studio在调试程…

十一、图像二值化

一、二值图像 其实就是把图像转换为只有黑白的两种颜色图像&#xff0c;即像素值非零即一 三角阈值二值化 对一个图像进行操作&#xff0c;获取图像的直方图&#xff0c;找到波峰和波谷进行连线设为线段A&#xff0c;每个点做有关线段A的垂线垂足在线段A上&#xff0c;最后将…

地毯店 如何辨别地毯的好坏?

在实地选购地毯品牌时&#xff0c;许多地方需要引起注意&#xff0c;而且要显得专业&#xff0c;这样才能科学深入地辨别地毯的好坏。比如&#xff0c;辨明拉绞地毯和抽绞地毯两种工艺的打结方法几乎相同&#xff0c;只是变绞形式上有所区别。抽绞的方式较古老&#xff0c;一般…

十二、图像金字塔

一、原理 reduce高斯模糊降采样 expand扩大卷积 PyrDown&#xff1a;降采样 PyrUp&#xff1a;还原 二、高斯金字塔 import cv2 import numpy as np from matplotlib import pyplot as pltdef pyramid(image):level 3temp image.copy()pyramid_image []for i in range(le…