1 c語言中static修飾函式/變數:所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問;static修飾函式和變數時,變數和函式就變成了內部鏈結,外部不可見,(作用域只在本檔案)其他原始檔不能訪問
**例子如下:
.h檔案
#pragma once
static void testc();
.c檔案
#include#include"c.h"
static void testc()
.main檔案
#include#include"c.h"
int main()
執行結果出錯:,如果去掉static就編譯正確
2.1 c語言中static修飾區域性變數:變數的生命週期是整個程式的執行期間生命週期是整個程式的執行期間,變數沒有初始化的話,自動初始化為0
例子如下:
#includeint* test()
void t()
int main()
執行結果如下:
b在函式呼叫結束後還沒有釋放掉,說明b的生命週期是整個程式的執行期間,因為static修飾後b放在靜態區
2.2 c語言中static修飾全域性變數:他與全域性變數的區別在於全域性變數作用域是全域性(所有檔案只能定義乙個),而static修飾的在不同的檔案中可以定義相同的名稱,因為static作用域在本檔案中 所以不同檔案中的變數名雖然一樣 但是他是不同的變數(和兩個不同函式中定義相同名字的區域性變數一樣)
例子:.h檔案
void testa();
a.c檔案
#include static int a=10;
void testa()
main.c檔案
在main函式中testa列印的是自己a.c中的變數a1000 main檔案中輸出是自己的變數a 100,而且a.c和main.c可以定義static int a說明static修飾後是內部鏈結 如果你去掉static就會報錯
3 c++static修飾資料成員變數/成員函式:
注意:在c++中static作用相容修飾c語言的作用(改變作用域和生命週期)最重要的只有一種作用,就是static修飾的靜態成員是屬於這個類,所有物件共享這個靜態成員
成員變數:
靜態成員變數必須在類中宣告,在類外定義
靜態資料成員不屬於某個物件,在為物件分配空間中不包括靜態成員所佔空間
靜態資料成員可以通過類名或者物件名來引用
例子如下:
#includeusing namespace std;
class test
static void test()
; static int val;
};int test::val = 100; //不能在類內初始化,類內初始化的值必須為常量,必須在類外定義初始化,定義不能加static
int main()
執行結果:
結果為100說明是可以通過類名訪問,等於1說明靜態成員變數不在類中,空類值為1
成員函式:
靜態成員函式只能訪問靜態變數,不能訪問普通成員變數,因為靜態成員函式不含this指標
靜態成員函式的使用和靜態成員變數一樣,可以通過類名呼叫
靜態成員函式也有訪問許可權,
例子如下:
.h檔案
#pragma once
class test
;
.cpp檔案
#includeusing namespace std;
#include"cpp.h"
int test::val = 100;
test::test()
void test::test()//類外定義時和靜態資料成員一樣不能加static
void test::nstatic()
main檔案
#include#include"cpp.h"
using namespace std;
int main()
執行結果:
c c static關鍵字的總結
1.先來介紹它的第一條也是最重要的一條 隱藏。static函式,static變數均可 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。舉例來說明。同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。a.cchar a a global variable voi...
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
C static關鍵字作用
1.static修飾全域性變數 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。未加static的全域性變數,在符號表中是global符號,其他目標檔案可見,這樣的符號是要參與符號解析的。加了static之後,是local符號,其他目標檔案不...