Const修飾的類型跟它自己的內存值有關,而Static修飾的類型跟它內存生命週期有關多線程
只用於本文件的函數要所有使用static關鍵字聲明,這是一個良好的編碼風格
(1)對其餘源文件隱藏
(2)保持變量內存的持久,保持惟一性,只佔一分內存
(3)默認初始化爲0函數注意:形參不能被static修飾this
- 規則:
規則1:普通局部變量用完就釋放,因此當咱們須要屢次用到同一份變量數據的時候,就能夠用static來留住這個變量的數據編碼
保持內存的持久(保持惟一性,只佔一分內存)spa
規則1:普通局部變量用完就釋放,因此當咱們須要屢次用到同一份變量數據的時候,就能夠用static來留住這個變量的數據線程
void A(){ //普通局部變量存儲於進程棧空間,使用完畢後會當即釋放 //靜態局部變量編譯器會默認初始化爲0,存儲於進程的全局數據區,程序結束時釋放 static int a=1; }
對其餘源文件隱藏指針
規則2:全局變量可能會致使多線程競爭同一份數據,用static能夠把變量留住在單一源文件裏面使用code
//全局變量自己就有內存的持久性,因此靜態全局變量用於在其餘源文件屏蔽該變量 //全局變量定義在函數體外部,在全局數據區分配存儲空間,且編譯器會自動對其初始化 //普通全局變量對整個工程可見,其餘文件可使用extern外部聲明後直接使用,也就是說其餘文件不能定義一個同名的變量 //靜態全局變量僅對其當前文件可見,其餘文件不可訪問,其餘文件能夠擁有同名的變量 //file1.cpp int varA; static int varB; //file2.cpp extern int varA; //使用其餘源文件的全局變量 extern int varB; //錯誤,靜態全局變量被屏蔽
對其餘源文件隱藏對象
規則3:blog
//非靜態函數能夠在另外一個文件中直接引用沒必要加extern聲明 //靜態函數只能在聲明它的文件中可見,其餘文件不能引用該函數 //不一樣的文件可使用相同名字的靜態函數 //file1.cpp extern void funA(){} static void funB(){} //file2.cpp extern void funA(); //使用其餘源文件的全局變量 extern void funB(); //錯誤,靜態全局函數屏蔽了該函數
非靜態成員可以訪問靜態成員,由於生命週期還在.
靜態成員不能訪問非靜態成員
默認初始化爲0,保持內存的持久(保持惟一性,只佔一分內存),不存在this指針
//靜態成員能夠獨立訪問,無須建立任何對象實例就能夠訪問 //靜態成員變量每一個class只有一份變量內存(全局數據區/靜態區),而普通成員函數每一個對象都有不一樣的變量內存 //test.h class A{ private: static const int a; } //test.cpp const int A::a=1; //不受private和protected訪問限制
保持內存的持久(保持惟一性,只佔一分內存)
//類的靜態成員函數沒法調用類的非靜態成員函數和變量,由於靜態成員函數沒有this指針 //類的非靜態成員函數能夠調用類的靜態成員函數和變量 //靜態成員函數不能夠同時聲明爲virtual const volatile函數 class A{ public: virtual static void fun1(); //錯誤 static void fun2() const; //錯誤 static void fun2() volatile; //錯誤 };