1. 程式人生 > >const,static,全域性變數細節及其區別

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++ staticconststatic 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++中類中常規變數conststaticstatic 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

預處理、conststatic與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字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯