const,static,全域性變數細節及其區別
const:
限制符號,限制某個變數所指向的內容不能通過這個物件修改。
但是可以通過其他的修改,比如:
int main(){
int x=5;
const int &y=x;
x++;
cout<<y<<" "<<x;
return 0;
}
結果如下:
但是如果這樣就通不過編譯了
所以,const的作用是限制申明出來的變數的許可權,所以我們有這麼一個等式:
許可權小=許可權大 許可權大!=許可權小
什麼意思呢:如下:
int main(){ int x=5; const int* y=&x; x++; cout<<*y<<" "<<x; return 0; }
上式是可以通過編譯的,結果為6 6.我們將一個許可權大的變數x賦值了一個常量指標指向它。同上x可以改變該變數的值,*y不能,但如果向下式子就不能通過編譯了:
int main(){
const int x=5;
int* y=&x;
x++;
cout<<*y<<" "<<x;
return 0;
}
因為我們將一個許可權是隻讀的變數讓正常指標指向(賦值是可以的,指標引用不行),無意間擴大了它的許可權,這樣對於計算機而言意味著風險,所以編譯器會禁止這種做法
const最後一個問題是const與指標的問題,const出現在*號前,代表這個指標只能指向常量,出現在*號後,代表這個指標只能指向那塊區域,但是那塊區域的值可以改動,如下:
int main(){
const int y=5;
int z=0;
const int* x=&y;
x=&z;
cout<<*x<<" "<<x;
return 0;
}
*x為0;
int main(){
const int y=5;
int z=0;
int const* x=&y;
x=&z;
cout<<*x<<" "<<x;
return 0;
}
結果同上
int main(){ int y=5; int z=0; int * const x=&y; x=&z; cout<<*x<<" "<<x; return 0; }
這個式子編譯就不過了,但是這樣可以:
int main(){
int y=5;
int z=0;
int * const x=&y;
(*x)++;
cout<<*x<<" "<<x;
return 0;
}
static:
static作用有以下兩個:
1.規定變數作用區域,就是變數所在的函式或類(同於區域性變數),只有在該函式/類才能呼叫。被static申明的變數只能在該檔案被呼叫!
2.規定變數的儲存地址(也就是確定了其生存期),static變數存在靜態區域,不是在棧空間,函式/類執行完畢後不會被回收,且其值會一直保留,直至程式結束
全域性變數:
全域性變數就是靜態變數少了第一個約束,它可以被任意的類或函式呼叫
static的全域性變數:
作用是聲明瞭一個全域性變數,但是它只能在該檔案內被使用,外部無法使用。下面詳細介紹一下該類變數,並引入內外部連結及extern的使用。
注:關於編譯連結這塊的理解僅個人理解,可能有問題,若理解有問題請指出
編譯的作用範圍:一個檔案(即一個.c或者一個.cpp)
連結:將不同的cpp組裝,如將函式宣告和程式碼實現拼接
內連線:檔案內部的組裝
外連線:不同檔案間的組裝,extern其實就是外連線
假設我們有兩個檔案a.cpp和b.cpp
分別如下:
//a.cpp
#include<iostream>
int num=9;
//b.cpp
#include<iostream>
extern int num;
cout<<num<<endl;
這樣,在b.cpp中,就可以直接使用num變數且改變a中的num和b中的num效果相同,extern不分配空間!
但是如果在b中extern int num=8;就會報錯了
那麼當我們定義的全域性變數不想被其他檔案所使用怎麼辦?
用static修飾!,如下:
//a.cpp
#include<iostream>
static int num=9;
//b.cpp
#include<iostream>
extern int num;
cout<<num<<endl;
這樣就不能通過編譯了,因為在連線時候,a中的變數num對b來說不可見
相關推薦
const,static,全域性變數細節及其區別
const: 限制符號,限制某個變數所指向的內容不能通過這個物件修改。 但是可以通過其他的修改,比如: int main(){ int x=5; const int &y=x; x++; cout<<y<<" "&l
C語言中static全域性變數與普通的全域性變數區別
下面是中興通訊2012校招筆試題的一道問答題: 1. static全域性變數與普通的全域性變數有什麼區別 ? 全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。 全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上
領卓教育之static 全域性變數、區域性變數、函式與普通全域性變數、區域性變數、函式的區別
1,全域性變數(外部變數)的說明之前再冠以 static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態 (1)全域性變數的作用域是整個源程式, 當一個源程式
C++ static、const和static const型別成員變數宣告及其初始化
C++ static、const和static const型別成員變數宣告及其初始化 const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。 static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具
static全域性變數和普通全域性變數區別?static區域性變數和普通區域性變數區別?static函式和普通函式區別
幾者的區別從三個方面考慮: 1初始化時間 2 作用域 3 分配記憶體空間 static全域性變數和普通全域性變數區別: 區別: 1.static全域性變數編譯是初始化,在main()函式之前初始化並且僅初始化一次; 2.static全域
static全域性變數與普通全域性變數區別?static區域性變數與普通區域性變數區別?static函式與普通函式區別?
static 宣告的變數在C語言中有兩方面的特徵: 1.變數被放在程式的全域性儲存區中,這樣在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。 2.變數用static告知編譯器,自己僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。Tips:A.若全域性變數僅在單個C檔案中訪
C++中類中常規變數、const、static、static const(const static)成員變數的宣告和初始化
C++類有幾種型別的資料成員:普通型別、常量(const)、靜態(static)、靜態常量(static const)。這裡分別探討以下他們在C++11之前和之後的初始化方式。 c++11之前版本的初始化 在C++11之前常規的資料成員變數只能在建構函式
static全域性變數
今天在修改審計日誌的bug,因為第三方登入的credentials是隻攜帶了第三方的登入帳號資訊,得不到第三方帳號繫結在ldap認證源的使用者uid,審計日誌輸出資訊錯誤。 專案在取到登入使用者的uid後去ldap認證源中查詢繫結的uid,這時取到uid後,無法給到OauthCredential
static全域性變數,導致資料衝突嚴重錯誤
1.今天遇到一個嚴重問題: a 使用者登入網站 檢視自己發表的文章並把自己的登入名儲存到static中,以為這樣可以儲存自己的username b 使用者登陸後,a點選重新整理,發現數據不是自己的了,而是b使用者的 原因很明瞭 因為static是所有類共有的,不屬於任何
普通區域性變數、普通全域性變數、static區域性變數、static全域性變數
一、普通全域性變數和普通區域性變數的關係 通常情況下,如果有兩個同名變數,一個是普通全域性變數,另一個是普通區域性變數,那麼區域性變數在其作用域內具有較高的優先權,它將遮蔽全域性變數。 #include <stdio.h> #include<iostr
const,全域性變數
const定義的變數是可以被修改的,只不過不能被顯式修改,報錯是編譯器給出的,在編譯的時候,如果編譯器發現const被修改了則會報錯,但是在執行的時候,卻是可以修改的,因此const具有變數的屬性。並不是常量。 下面這一段程式碼可以證明上面的判斷int main{char buf[4];const int a
預處理、const、static與sizeof-使用const與#define的特點及區別
特點 周期 sizeof 傳遞 const常量 fin 參數 編譯器 run 1:#define只是用來做文本替換的。例如: #define PI 3.1415926 float angle; angle=30*PI/180; 那麽,程序進行編譯的時候,編譯器會
## 標題:指標的值傳遞與地址傳遞,全域性變數傳遞,與形參傳遞的區別與結果
標題:指標的值傳遞與地址傳遞,全域性變數傳遞,與形參傳遞的區別與結果 1.值傳遞與地址傳遞 下面看著段程式碼:void swap(int a, int b){ int t; t=a; a=b; b=t; } void swap1(int *p1,int *p2){ int t; t=*p
C++靜態全域性變數和全域性變數的區別
靜態全域性變數 非靜態全域性變數 儲存方式 靜態儲存 靜態儲存 作用域 定義該變數的原始檔內 所有原始檔 解釋: 共同點:
一文解決 PHP靜態(區域性/全域性)變數、auto(區域性/全域性)變數、類中static
一、靜態區域性變數、auto區域性變數、類中static 這是我的概念: 類屬性,類方法:是給類使用的,在類中使用 self::和 static:: 代表,供呼叫 例項屬性,例項方法:是給例項使用的,在類中使用 this-> 代表,供呼叫 <?php /**
全域性變數、靜態變數、區域性變數、const變數
生命週期: 一個變數存在的週期 作用域: 一個變數可以被引用的範圍 作用域 生命週期 定義方法 記憶體分佈 注意 全域性
C/C++ 全域性變數和區域性變數在記憶體裡的區別?堆和棧
一、預備知識—程式的記憶體分配 一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧,如果還不清楚,那麼就把它想成陣列,它的記憶體分
[轉]C/C++定義全域性變數/常量幾種方法的區別
在討論全域性變數之前我們先要明白幾個基本的概念: 原文章地址:https://www.cnblogs.com/wanghetao/p/4492582.html 1. 編譯單元(模組): 在IDE開發工具大行其道的今天,
全域性變數與區域性變數的區別
一、變數的分類 變數可以分為:全域性變數、靜態全域性變數、靜態區域性變數和區域性變數。 按儲存區域分,全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的靜態儲存區域,區域性變數存放在記憶體的棧區。 按作用域分,全域性變數在整個工程檔案內都有效;靜
static作用有三條全域性變數,函式,區域性變數https://www.cnblogs.com/liuna/p/7238239.html
在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。 (1)先來介紹它的第一條也是最重要的一條:隱藏。 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯