static簡介:
static方法就是沒有this的方法,在static方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用。
面向過程設計中的static
1.修飾靜態全局變量時
特點:
a.該變量在全局數據區分配內存
b.未經初始化的靜態全局變量默認值爲0
c.static修飾的變量整個文件中都是可見的
和全局變量的區別:
a.不能被其他文件使用
b.其他文件中可以定義相同名字的變量,沒有命名衝突 (靜態函數相同)
2.修飾靜態局部變量時
代碼說明:
#include <iostream>
using namespace std;
void func()
{
static int n = 10;
cout << n << endl;
n++;
}
void func1()
{
int n = 10;
cout << n << endl;
n++;
}
int main()
{
func();
func();
func();
func1();
func1();
func1();
system("pause");
return 0;
}
輸出結果:10,11,12,10,10,10
可以看出:普通局部變量作用域在func函數體內部,內存分配在棧區,函數結束即釋放。
靜態局部變量存放在全局數據區,作用域在整個文件內部。
面對對象設計中的static
1.修飾靜態數據成員時
特點:
a.類創建多個對象時,靜態數據成員在類中只有一份拷貝,只分配一次內存,由該類型的所有對象共享使用
b.靜態數據成員和普通的數據成員一樣遵守public訪問規則
static int sum;聲明靜態數據成員
int MyClass::sum = 0;定義並初始化靜態數據成員(不能在類中初始化)
c.類的靜態數據成員2種訪問形式
1.類對象名.靜態數據成員名 或者 2.類型型名::靜態數據成員名
優點:節省空間,實現共享
和全局變量相比:1.無命名衝突 2.可以是private屬性,信息隱藏
2.修飾靜態成員函數時
爲類的全部服務而不是爲類的某一個對象服務
因此無this指針,無法訪問非靜態數據成員和函數,反過來可以
特點:
1.類體外的函數定義不能指定關鍵字static
2.訪問權限(。。。。。。。。。。。。。)
3.無this指針,不會產生額外開銷,比全局函數運行速度快
調用方法:<類名>::<靜態成員函數名>(<參數表>)