網站首頁 編程語言 正文
1、作用域
1.1 作用域的作用
作用域——scope
通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。
簡單來說,作用域的使用減少了代碼中名字的重復沖突,增強了程序的邏輯性與可靠性
1.2 作用域的分類
C++變量根據定義位置的不同,具有不同的作用域:
- 全局作用域
- 局部作用域
- 文件作用域
全局變量具有全局作用域
全局變量只需在一個源文件中定義,就可以作用于所有的源文件
其他不包括全局變量定義的源文件需要用extern關鍵字再次聲明這個全局變量
靜態局部變量具有局部作用域。它只被初始化一次,從第一次初始化直到程序運行結束都一直存在,他和全局變量的區別在于全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見
局部變量也只有局部作用域,他是自動對象,他在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用結束后,變量就被撤銷,其所占用的內存也被收回
靜態全局變量也具有全局作用域,他與全局變量的區別在于如果程序包含多個文件的話,他作用于定義它的文件里,不能作用到其他文件里,即被static關
鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同的靜態全局變量,也是不同的變量
1.3 static 、const
1.3.1 static
靜態函數只能被所在的cpp文件調用,不同cpp文件可以有相同的靜態函數名字。靜態函數與普通函數作用域不同,僅在本文件。內部函數:只在當前源文件中聲明和定義的函數稱為內部函數(static);對于可在當前源文件以外使用的函數,應該在頭文件中說明,或者進行extern全局聲明。static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
static作用于局部變量時
在局部變量聲明前加static = 靜態局部變量,存儲方式改變了,局部變量是動態存儲,靜態局部變量是靜態存儲方式,也就是改變了它的生存期由函數內部或者塊內部變為文件作用域,雖然并不是真正的“文件作用域”,聲明在函數內,但是在函數外部無法訪問,只是為了避免重名沖突
static作用于全局變量時
在全局變量聲明前加static = static全局變量,全局變量本身是靜態存儲方式,靜態全局變量也是靜態存儲方式,在存儲方式上無區別,無改變,主要區別在于非靜態全局變量的作用于是整個源程序(由多個源程序組成的話,在各個源文件中都有效);靜態全局變量限制了作用域,只在定義該變量的源文件中有效(全局作用域->文件作用域),可避免在其他文件中引起錯誤,static變量只初始化一次,下一次依照上一次的值。
總結:
靜態局部變量擴大了局部變量的生存期,靜態全局變量縮小了全局變量的作用域
1.3.2 const
const在C語言和C++中存在差異,先來解釋其中的區別
在C語言中,Const修飾的變量只是告訴編譯器該變量是一個只讀的變量,不能通過該變量改寫器內存空間中的值,但是其本質上還是一個變量,既然是變量,就會有內存地址,因此可以通過指針間接修改該地址空間的值,舉例如下
在C++中Const修飾的變量被稱為常量,其值存放在常量表中,在使用常量時,編譯器回到常量表中查詢對應的常量,并將其替換,這部分沒有涉及內存分配,因此對其取地址是沒有意義的,但是當我們非要對該常量去地址時,則編譯器會為其臨時分配一個內存,并將常量值存入該臨時內存中。事實上,在C++中規定必須用const修飾的指針來指向const修飾的常量。雖然可以使用強制轉換的方式,對Const修飾的常量進行去地址,并將其賦值給一個非Const修飾的指針(最好不要這樣做),但打這個指針上的任何改動只會影響到臨時分配的內存空間,而不會影響到原常量上
2、 域作用限定符
作用域限定符為兩個冒號::,其作用是通知編譯器從作用域限定符左側名字所示的作用域中尋找右側名字
即指定訪問指定空間的成員
2.1 空間域的命名
namespace NewSpace
{
int time = 3600;
...
}//命名可嵌套
2.2 指定空間訪問
指定空間 ::操作
實例:
std :: cout << "" << std :: endl//std::代表訪問標準庫
用全局展開的標準庫就可以避免在cout endl前指定標準庫也是一個方法,但是對于可能產生的沖突,我們還是采取指定空間訪問的方法
2.3 全局展開
將某空間在某個局部或者全局展開,就可以自由使用操作
using namespace ...
2.4 部分展開
部分展開只需要展開我們需要用的操作,比如:
using std :: cout
3、函數重載
在C語言程序的編寫中,可能會用到幾個功能相同的函數,但是有些細節卻不同。
例如:交換兩個數的值其中包括(int, float,char,double)這些個類型,我們通常借助不同的命名來完成區分
void Swap1(int* a, int* b);
void Swap2(float* a, float* b);
void Swap3(char* a, char* b);
void Swap4(double* a, double* b);
我們可以看出這樣的代碼不美觀而且不便,于是在C++中人們提出可以用一個函數名定義多個函數,也就是所謂的函數重載
3.1 函數重載規則
- 函數名稱必須相同
- 參數列表必須不同(個數不同、類型不同、參數排列順序不同等)
- 函數的返回類型可以相同也可以不相同
- 僅僅返回類型不同不足以成為函數的重載
實例:
#include<iostream>
using namespace std;
int main()
{
int max(int a, int b, int c);
int max(int a, int b);
int a = 10;
int b = 20;
int c = 30;
cout << max(a, b, c) << endl;
cout << max(a, b) << endl;
return 0;
}
int max(int a, int b, int c)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
int max(int a, int b)
{
return (a > b) ? a : b;
}
原文鏈接:https://blog.csdn.net/qq_64893500/article/details/128857494
相關推薦
- 2022-04-05 android使用shape自定義Switch組件
- 2022-03-31 k8s中kubeconfig的配置以及使用詳解_云其它
- 2022-12-04 Python中的配對函數zip()解讀_python
- 2023-01-14 C++?win系統如何用MinGW編譯Boost庫_C 語言
- 2022-09-04 python?matplotlib庫繪圖實戰之繪制散點圖_python
- 2022-03-18 Linux系統配置(服務控制)詳細介紹_Linux
- 2024-01-06 關于class.getClassLoader().getResourceAsStream()和cla
- 2022-04-25 C#中使用DevExpress中的ChartControl實現極坐標圖的案例詳解_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支