C++ 入門03:函數與作用域

往期回顧:

C++ 入門01:初識 C++-CSDN博客
C++ 入門02:控制結構和循環-CSDN博客


一、前言

在前面的文章學習中,我們了解了C++語言的基礎,包括如何定義變量來存儲數據,以及如何利用輸入輸出流實現程序與用戶之間的無縫交互。此外,還掌握了控制結構——條件語句與循環結構。

而今天的學習內容則是C++中的函數與作用域。這部分內容是編寫模塊化代碼和管理變量范圍的關鍵。函數,作為任何一門編程的基石之一,它允許我們將代碼分割成可重用的獨立塊,每個塊都執行特定的任務。這種模塊化編程的思想極大地提高了代碼的可讀性、可維護性和復用性。通過學習函數,我們將學會如何定義自己的函數來封裝特定的功能,并通過參數傳遞和返回值機制來實現函數間的數據交換。

而作用域則定義了變量、函數等標識符在程序中可見和可訪問的區域。理解作用域不僅有助于我們更好地管理變量的生命周期和訪問權限,還能避免命名沖突等常見問題。在C++中,作用域可以細分為全局作用域、局部作用域、塊作用域以及函數原型作用域等,每種作用域都有其特定的規則和用途。

二、函數與作用域

?2.1、?函數

函數是執行特定任務或操作的獨立代碼塊。這種模塊化設計極大地促進了代碼的組織、重用和維護,一個典型的 C++ 函數包括函數聲明和函數定義。

(1)函數聲明

函數聲明(也稱為函數原型)為編譯器提供了函數的基本信息,包括函數的返回類型、名稱以及它接受的參數類型和數量。函數聲明通常放在頭文件中(.h或.hpp文件),或者在源文件的開始部分,以便在調用函數之前讓編譯器知道該函數的存在和如何調用它。

示例:

// 函數聲明示例  
int add(int a, int b);

?這個聲明表明add是一個函數,它接受兩個整型參數(ab),并返回一個整型值。

(2)函數定義

函數定義提供了函數的實際實現,即函數體中的代碼,這些代碼定義了函數如何執行其任務。函數定義必須包含函數的所有部分:返回類型、函數名、參數列表(包括參數的類型和名稱)以及函數體(即大括號{}內的代碼)。

示例:

// 函數定義示例  
int add(int a, int b) {  return a + b;  
}

在這個例子中,add函數的定義包含了其完整的實現:它簡單地將兩個整數參數相加,并返回它們的和。?

(3)?函數參數

函數可以接受參數,這些參數在調用時傳遞給函數。

示例:

void printMessage(std::string message) {std::cout << message << std::endl;
}int main() {printMessage("Hello, World!");return 0;
}

(4)函數返回值

函數可以返回一個值。返回值的類型由函數的返回類型決定。

示例:

double multiply(double a, double b) {return a * b;
}int main() {double result = multiply(2.5, 4.0);std::cout << "Result: " << result << std::endl;return 0;
}

(5)函數調用

一旦函數被聲明和定義,它就可以在程序的其他部分被調用了。調用函數時,需要提供與函數聲明中指定的數量和類型相匹配的參數。

示例:

#include <iostream>  // 函數聲明  
int add(int a, int b);  int main() {  // 調用函數  int sum = add(5, 3);  std::cout << "Sum: " << sum << std::endl; // 輸出:Sum: 8  return 0;  
}  // 函數定義  
int add(int a, int b) {  return a + b;  
}

在這個例子中,main函數調用了add函數,并傳遞了兩個整數(5和3)作為參數。add函數計算這兩個數的和,并通過return語句將其返回給調用者(在這里是main函數)。然后,main函數將返回的值存儲在變量sum中,并將其打印到控制臺。??

2.2、 作用域

作用域是變量在程序中的可見性范圍。C++ 中有四種主要的作用域:局部作用域、全局作用域、類作用域和命名空間作用域。這些作用域共同構成了C++程序中標識符的可見性和生命周期的框架。理解這些作用域對于編寫清晰、可維護的C++代碼至關重要。

(1)局部作用域

局部作用域是變量在其被聲明的代碼塊(如函數體、循環體、條件語句塊等)內有效的區域。一旦離開這個代碼塊,該變量就不再可見,其占用的內存也會被釋放(對于自動存儲期的變量而言)。局部變量通常用于存儲臨時的、僅在特定函數或代碼塊內需要的數據。

示例:

void myFunction() {  int localVar = 10; // localVar 在 myFunction 的局部作用域內有效  // ...  
} // localVar 在這里失去作用域

(2)全局作用域

全局作用域是變量在程序的所有部分都可見的區域,但通常是在所有函數之外聲明的。全局變量在整個程序運行期間都保持其值,直到程序結束。然而,過度使用全局變量通常被認為是不好的編程實踐,因為它們可能導致代碼難以理解和維護,以及引入難以發現的bug。

示例:

int globalVar = 20; // globalVar 在全局作用域內有效  void anotherFunction() {  // 在這里可以訪問 globalVar  
}

(3)類作用域

類作用域是面向對象編程中的一個重要概念,它定義了類成員(包括變量和函數)的可見性和訪問權限。類成員變量(也稱為屬性或字段)和成員函數(也稱為方法)在類的定義內部聲明,并只能通過類的對象或指針來訪問(除非它們是靜態成員)。類作用域有助于封裝數據,即將數據和相關操作組合在一起,形成一個獨立的實體。

示例:

class MyClass {  
public:  int classVar; // classVar 在 MyClass 的類作用域內有效  void myMethod() {  // 在這里可以訪問 classVar  }  
};

(4)命名空間作用域

命名空間作用域是C++中用于解決命名沖突的一種機制。它允許你將一組相關的標識符(如變量名、函數名等)封裝在一個命名空間中,從而避免與其他命名空間中的標識符發生沖突。使用命名空間可以提高代碼的組織性和可讀性,同時減少命名沖突的可能性。

示例:

namespace MyNamespace {  int namespaceVar = 30; // namespaceVar 在 MyNamespace 的命名空間作用域內有效  void myNamespaceFunction() {  // ...  }  
}  // 訪問命名空間中的成員需要使用作用域解析運算符 ::  
int main() {  int x = MyNamespace::namespaceVar;  MyNamespace::myNamespaceFunction();  return 0;  
}

以上就是 C++ 中函數與作用域的基本用法的知識點了。函數幫助我們組織和重用代碼,而理解作用域有助于我們管理變量的可見性和生命周期。

都看到這里了,點個贊再走唄朋友~

加油吧,預祝大家變得更強!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43801.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為機考真題 -- 找朋友

題目描述: 在學校中,N 個小朋友站成一隊, 第 i 個小朋友的身高為 height[i],第 i 個小朋友可以看到的第一個比自己身高更高的小朋友 j,那么 j 是 i 的好朋友(要求 j >i)。請重新生成一個列表,對應位置的輸出是每個小朋友的好朋友位置,如果沒有看到好朋友,請在該位置…

微軟清華提出全新預訓練范式,指令預訓練讓8B模型實力暴漲!實力碾壓70B模型

現在的大模型訓練通常會包括兩個階段&#xff1a; 一是無監督的預訓練&#xff0c;即通過因果語言建模預測下一個token生成的概率。該方法無需標注數據&#xff0c;這意味著可以利用大規模的數據學習到語言的通用特征和模式。 二是指令微調&#xff0c;即通過自然語言指令構建…

Python面試題:請解釋什么是鴨子類型(duck typing)?

鴨子類型&#xff08;Duck Typing&#xff09;是一種動態類型語言中的概念&#xff0c;它基于對象的行為&#xff08;方法和屬性&#xff09;而不是其實際類型進行判斷。這個概念源自詹姆斯惠特科姆賴利的諺語&#xff1a; “如果它走起來像鴨子&#xff0c;叫起來像鴨子&#…

通過高德地圖 JS API實現單擊鼠標進行標注

效果圖: 核心代碼: <template><a-modal title="選擇地圖所在位置" :width="width" :visible="visible" @ok="handleOk" @cancel="handleCancel" cancelText="關閉"><div class="location-…

場外期權有交割日嗎?場外期權應該怎么交割?

今天帶你了解場外期權有交割日嗎&#xff1f;場外期權應該怎么交割&#xff1f;場外個股期權是一種非標準化的金融衍生品&#xff0c;它允許投資者在未來某一特定日期以特定價格買入或賣出某一特定股票。 交割日就是買賣雙方進行交割的日期,期權合約具有到期日,到期日的后一天…

WEB安全-文件上傳漏洞

1 需求 2 接口 3 MIME類型 在Web開發中&#xff0c;MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;類型用于標識和表示文檔的格式。這些類型在HTTP請求和響應頭中扮演著重要的角色&#xff0c;告訴瀏覽器如何解釋和處理接收到的資源12。 以下是一些Web開發…

ChatGPT:Java Stream 的疑問

ChatGPT&#xff1a;Java Stream 的疑問 解釋一下 List<SupplierVm> collect tSupplierPage.getRecords().stream().map(item ->{SupplierVm supplierVm new SupplierVm();BeanUtils.copyProperties(item, supplierVm);return supplierVm;}).collect(Collectors.to…

【JavaScript】具有 iterable 接口的數據結構

具有 iterable 接口的數據結構指的是可以通過迭代器&#xff08;Iterator&#xff09;訪問其成員的數據結構。在 JavaScript 中&#xff0c;具有 iterable 接口的數據結構包括數組&#xff08;Array&#xff09;、字符串&#xff08;String&#xff09;、Set、Map 等。這些數據…

C電池 和 D 電池的作用和類型詳解及其之間的區別

C 和 D 電池是我們日常生活中必不可少的部件。它們通常用于高功率設備。例如手電筒和玩具。 D 型電池和 C 型電池是兩種常見的電池類型。它們是一次性圓柱形電池。您可以在很多設備上使用它們。雖然它們有很多相似之處&#xff0c;但它們也有不同的特點。這些特點使它們適合某…

如何用qq郵箱注冊outlook郵箱

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ??寶劍鋒從磨礪出&#xff0c;梅花香自苦寒來 ? 目錄 第一步輸入qq郵箱 第二步…

數據類型及數據塊認知

西門子STEP7編程語言 梯形圖(LAD) 功能塊圖(FBD) 語句表(STL) 其中梯形圖和功能塊圖可以相互轉換 CPU常用數據區 信號輸入區 I 信號輸出區 Q 程序中表現形式&#xff0c;IX.X/QX.X;IWX/QWX-訪問的是CPU輸出輸入過程映像區 另一種形式IWX:P/QWX:P-訪問的是信號端口地址&#xf…

深度整合全球資源,分貝通打造高效、合規的海外差旅管理平臺

在全球化商業活動的背景下,中國企業出海已成為常態。然而,隨著海外差旅市場的全面增長,企業在海外支出管理上面臨諸多挑戰。據2023年數據顯示,分貝通出海差旅業務GMV同比增長高達500倍,這一增長背后隱藏著企業對于更省錢、更高效管控方式的迫切需求。 面對與日俱增的開支,企業開…

js對象的方法速覽---數組的靜態方法,實例方法和屬性合集,各包含一個示例

tip&#xff1a; 本文僅作為查找和基本使用的展示&#xff0c;需要深入了解這些方法的使用請參考&#xff1a;Object - JavaScript | MDN (mozilla.org) 可以通過目錄快速鎖定需要查找的方法和查看它的使用 目錄 tip&#xff1a; 新建一個對象 實例屬性 實例方法 hasOwn…

Websocket 替代方案:如何使用 Firestore 監聽實時事件

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 ?在現代 Web 開發中,實時更新功能對于許多應用程序(如聊天應用、協作工具和在線游戲)都是必不可少的。雖然 WebSocket 是一種常用的實時通信技術,但 Google 的 Firestore 也提供了一種強大的替代方案,使得實時監聽變得…

Golang中defer和return順序

在Golang中&#xff0c;defer 和 return 的執行順序是一個重要的特性&#xff0c;它們的執行順序如下&#xff1a; return語句不是一條單獨的語句&#xff0c;實際上&#xff0c;它是由賦值和返回兩部分組成的。賦值步驟會先執行&#xff0c;這一步會計算return語句中的表達式…

Linux安裝Docker以及Docker Componse

一、安裝前準備工作 1.1 查看服務器系統版本以及內核版本 cat /etc/redhat-release 1.2 查看服務器內核版本 uname -r這里我們使用的是CentOS 7.4 系統&#xff0c;內核版本為3.10 1.3 安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm21.4 設置…

賽氪網受邀出席浙江省應用數學研究會,共啟數學教育與競賽新篇章

2024年7月5日&#xff0c;浙江省應用數學研究會在風景如畫的嘉興市成功舉辦了2024年學術研討會暨第七屆第六次理事會工作會議的首日活動。作為技術支持單位&#xff0c;賽氪網受邀參與此次盛會&#xff0c;彰顯了其在數學教育及競賽領域的深厚實力與積極貢獻。 開幕式由嘉興大學…

linux watchdog 子系統

目錄 一、watchdog 子系統二、關鍵數據結構2.1 watchdog_device2.2 watchdog_ops2.3 watchdog_info 三、重要流程3.1 watchdog 初始化3.2 watchdog 設備注冊3.3 watchdog 設備文件操作函數3.4 watchdog 喂狗用戶空間 watchdog&#xff08;busybox&#xff09;內核空間喂狗疑問 …

生成隨機密碼

生成8位無重復的密碼&#xff08;可以包含數字、大小寫字母&#xff09; import random import string character string.digits string.ascii_letters password .join(random.sample(character, 8)) print(f"生成的隨機密碼為:{password}")

rushAWD使用說明

rushAWD使用說明 檢查單 先開個坑&#xff0c;慢慢填 檢查單 af 配置項用途值conf.yaml總配置項靶機名:靶機IP