【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.pswp.cn/news/378039.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378039.shtml
英文地址,請注明出處:http://en.pswp.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…

創建bootstrap項目_使用Bootstrap創建第一個網頁

創建bootstrap項目使用Bootstrap創建第一個網頁 (Create First Webpage with Bootstrap) In the previous article, we learned "how to setup bootstrap?" for a web project. If you haven’t gone through that, it is recommended to read it. Now, in this art…

Chaikin Curve(球面插值)

在兩條折線間完成平滑的過渡是 用畫布做UI 或者做類似地圖編輯器一類的工作的 很常見的任務。 怎么樣化方為圓是決定工作效率的很重要的因素。&#xff08;當需要編輯的曲線多起來&#xff0c; 復雜起來的時候&#xff0c;這會是件相當繁重的工作&#xff09; 最容易想到的莫非…

【2020 電設G題 圖像題解】

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 2022.3.10新增訂閱通知 近期把此專欄設置為了付費模式,可以直接花9.9買這個專欄,買了就可以直接這個專欄的所有文章了。后…

六、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…

VS2005 there is no source code available for the current location 解決方案

1.首先試最常規的方法&#xff1a;Clean and then rebuild solution&#xff0c;但是沒有解決 2.進入Tools>Options,選擇Debugging>General 卻掉 Enable address-level debugging 選項&#xff0c;在去掉 Require source files to exactly match the original version. O…

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、后序遍歷為什么迭代法的中…

Asp.net 獲取當前目錄的三種方法

方法一&#xff1a; string sPath System.IO.Path.GetDirectoryName(Page.Request.PhysicalPath) 方法二&#xff1a; string sPath System.Web.HttpContext.Current.Request.MapPath("/") 方法三&#xff1a; string s…

一款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]輸…

在Python中以二進制格式輸入數字

Syntax to convert binary value to an integer (decimal format), 將二進制值轉換為整數(十進制格式)的語法&#xff0c; int(bin_value, 2)Here, 這里&#xff0c; bin_value should contain the valid binary value bin_value應該包含有效的二進制值 2 is the base value …

八、邊緣保留濾波(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…

LintCode 375. 克隆二叉樹(深復制)

先序遍歷構造二叉樹 TreeNode * preorder(TreeNode * root){if(rootNULL) return NULL;TreeNode * ans;ansnew TreeNode(root->val);if(root->left!NULL){ans->leftpreorder(root->left);}if(root->right!NULL){ans->rightpreorder(root->right);}return…

關于ECMAScript基礎入門的分享

目錄 ECMAScript基礎入門1. 介紹2. 變量與數據類型2.1 變量2.2 數據類型 3. 運算符3.1 算術運算符3.2 比較運算符 4. 控制流4.1 條件語句4.2 循環語句 5. 函數6. 對象與數組6.1 對象6.2 數組 7. 總結 ECMAScript基礎入門 1. 介紹 ECMAScript是JavaScript的標準規范&#xff0…

kotlin 計算平方_Kotlin程序來計算復利

kotlin 計算平方Compound interest is the sum of principal amount and interest of interest. 復利是本金和利息之和。 Given, principal, rate, and time, we have to calculate the Compound interest. 給定本金&#xff0c;利率和時間&#xff0c;我們必須計算復利。 Fo…

近代科學為什么誕生在西方-1

寬泛的講&#xff0c;近代科學是幾種文明在長達幾個世紀的持續交流碰撞中產生的。它正在日益成為全世界全人類都有效的普適科學。通向現代科學之路就是通向自由和開放交流之路。 馬克思韋伯和莫頓都認為&#xff0c;科學事業要持續的進步就要特定的文化和制度的支持。 中國的數…

九、圖像直方圖

一、圖像直方圖的屬性 說白了就是將圖像上的各個顏色通道上的像素點的像素值進行統計&#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 …