網(wǎng)站首頁 編程語言 正文
1、作用域
1.1 作用域的作用
作用域——scope
通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個(gè)名字的可用性的代碼范圍就是這個(gè)名字的作用域。
簡單來說,作用域的使用減少了代碼中名字的重復(fù)沖突,增強(qiáng)了程序的邏輯性與可靠性
1.2 作用域的分類
C++變量根據(jù)定義位置的不同,具有不同的作用域:
- 全局作用域
- 局部作用域
- 文件作用域
全局變量具有全局作用域
全局變量只需在一個(gè)源文件中定義,就可以作用于所有的源文件
其他不包括全局變量定義的源文件需要用extern關(guān)鍵字再次聲明這個(gè)全局變量
靜態(tài)局部變量具有局部作用域。它只被初始化一次,從第一次初始化直到程序運(yùn)行結(jié)束都一直存在,他和全局變量的區(qū)別在于全局變量對所有的函數(shù)都是可見的,而靜態(tài)局部變量只對定義自己的函數(shù)體始終可見
局部變量也只有局部作用域,他是自動對象,他在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用結(jié)束后,變量就被撤銷,其所占用的內(nèi)存也被收回
靜態(tài)全局變量也具有全局作用域,他與全局變量的區(qū)別在于如果程序包含多個(gè)文件的話,他作用于定義它的文件里,不能作用到其他文件里,即被static關(guān)
鍵字修飾過的變量具有文件作用域。這樣即使兩個(gè)不同的源文件都定義了相同的靜態(tài)全局變量,也是不同的變量
1.3 static 、const
1.3.1 static
靜態(tài)函數(shù)只能被所在的cpp文件調(diào)用,不同cpp文件可以有相同的靜態(tài)函數(shù)名字。靜態(tài)函數(shù)與普通函數(shù)作用域不同,僅在本文件。內(nèi)部函數(shù):只在當(dāng)前源文件中聲明和定義的函數(shù)稱為內(nèi)部函數(shù)(static);對于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在頭文件中說明,或者進(jìn)行extern全局聲明。static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
static作用于局部變量時(shí)
在局部變量聲明前加static = 靜態(tài)局部變量,存儲方式改變了,局部變量是動態(tài)存儲,靜態(tài)局部變量是靜態(tài)存儲方式,也就是改變了它的生存期由函數(shù)內(nèi)部或者塊內(nèi)部變?yōu)槲募饔糜?,雖然并不是真正的“文件作用域”,聲明在函數(shù)內(nèi),但是在函數(shù)外部無法訪問,只是為了避免重名沖突
static作用于全局變量時(shí)
在全局變量聲明前加static = static全局變量,全局變量本身是靜態(tài)存儲方式,靜態(tài)全局變量也是靜態(tài)存儲方式,在存儲方式上無區(qū)別,無改變,主要區(qū)別在于非靜態(tài)全局變量的作用于是整個(gè)源程序(由多個(gè)源程序組成的話,在各個(gè)源文件中都有效);靜態(tài)全局變量限制了作用域,只在定義該變量的源文件中有效(全局作用域->文件作用域),可避免在其他文件中引起錯(cuò)誤,static變量只初始化一次,下一次依照上一次的值。
總結(jié):
靜態(tài)局部變量擴(kuò)大了局部變量的生存期,靜態(tài)全局變量縮小了全局變量的作用域
1.3.2 const
const在C語言和C++中存在差異,先來解釋其中的區(qū)別
在C語言中,Const修飾的變量只是告訴編譯器該變量是一個(gè)只讀的變量,不能通過該變量改寫器內(nèi)存空間中的值,但是其本質(zhì)上還是一個(gè)變量,既然是變量,就會有內(nèi)存地址,因此可以通過指針間接修改該地址空間的值,舉例如下
在C++中Const修飾的變量被稱為常量,其值存放在常量表中,在使用常量時(shí),編譯器回到常量表中查詢對應(yīng)的常量,并將其替換,這部分沒有涉及內(nèi)存分配,因此對其取地址是沒有意義的,但是當(dāng)我們非要對該常量去地址時(shí),則編譯器會為其臨時(shí)分配一個(gè)內(nèi)存,并將常量值存入該臨時(shí)內(nèi)存中。事實(shí)上,在C++中規(guī)定必須用const修飾的指針來指向const修飾的常量。雖然可以使用強(qiáng)制轉(zhuǎn)換的方式,對Const修飾的常量進(jìn)行去地址,并將其賦值給一個(gè)非Const修飾的指針(最好不要這樣做),但打這個(gè)指針上的任何改動只會影響到臨時(shí)分配的內(nèi)存空間,而不會影響到原常量上
2、 域作用限定符
作用域限定符為兩個(gè)冒號::,其作用是通知編譯器從作用域限定符左側(cè)名字所示的作用域中尋找右側(cè)名字
即指定訪問指定空間的成員
2.1 空間域的命名
namespace NewSpace
{
int time = 3600;
...
}//命名可嵌套
2.2 指定空間訪問
指定空間 ::操作
實(shí)例:
std :: cout << "" << std :: endl//std::代表訪問標(biāo)準(zhǔn)庫
用全局展開的標(biāo)準(zhǔn)庫就可以避免在cout endl前指定標(biāo)準(zhǔn)庫也是一個(gè)方法,但是對于可能產(chǎn)生的沖突,我們還是采取指定空間訪問的方法
2.3 全局展開
將某空間在某個(gè)局部或者全局展開,就可以自由使用操作
using namespace ...
2.4 部分展開
部分展開只需要展開我們需要用的操作,比如:
using std :: cout
3、函數(shù)重載
在C語言程序的編寫中,可能會用到幾個(gè)功能相同的函數(shù),但是有些細(xì)節(jié)卻不同。
例如:交換兩個(gè)數(shù)的值其中包括(int, float,char,double)這些個(gè)類型,我們通常借助不同的命名來完成區(qū)分
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++中人們提出可以用一個(gè)函數(shù)名定義多個(gè)函數(shù),也就是所謂的函數(shù)重載
3.1 函數(shù)重載規(guī)則
- 函數(shù)名稱必須相同
- 參數(shù)列表必須不同(個(gè)數(shù)不同、類型不同、參數(shù)排列順序不同等)
- 函數(shù)的返回類型可以相同也可以不相同
- 僅僅返回類型不同不足以成為函數(shù)的重載
實(shí)例:
#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
相關(guān)推薦
- 2022-11-05 安裝ingress-nginx遇到的一些坑實(shí)戰(zhàn)記錄_云其它
- 2022-11-10 rust延遲5秒鎖屏的實(shí)現(xiàn)代碼_相關(guān)技巧
- 2021-10-12 shell實(shí)現(xiàn)Fisher–Yates?shuffle洗牌算法介紹_linux shell
- 2022-11-06 python使用minimize()?函數(shù)替代matlab的fmincon函數(shù)_python
- 2022-05-08 jquery實(shí)現(xiàn)淘寶詳情頁選擇套餐_jquery
- 2022-06-23 python基礎(chǔ)之while循環(huán)、for循環(huán)詳解及舉例_python
- 2022-09-16 Android?Jetpack架構(gòu)中ViewModel接口暴露的不合理探究_Android
- 2022-02-13 C++ SFINAE簡介和std::enable_if_t的簡單使用
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支