國(guó)企500強(qiáng)完整名單上海單個(gè)關(guān)鍵詞優(yōu)化
目錄
靜態(tài)成員
靜態(tài)成員變量
靜態(tài)成員函數(shù)
const 靜態(tài)成員屬性
靜態(tài)成員實(shí)現(xiàn)單例模式
靜態(tài)成員
在類定義中,它的成員(包括成員變量和成員函數(shù)),這些成員可以用關(guān)鍵字 static 聲明為靜態(tài)的,稱為靜態(tài)成員。 不管這個(gè)類創(chuàng)建了多少個(gè)對(duì)象,靜態(tài)成員只有一個(gè)拷貝,這個(gè)拷貝被所有屬于這個(gè)類的對(duì)象共享
靜態(tài)成員變量
靜態(tài)成員變量在內(nèi)存中只有一份,多個(gè)成員共享一個(gè)靜態(tài)變量
靜態(tài)成員變量必須類內(nèi)聲明,類外定義
靜態(tài)成員變量可以通過類的作用域訪問
靜態(tài)成員變量可以通過類的對(duì)象訪問
class Person{public://類的靜態(tài)成員屬性static int sNum;private:static int sOther;
};
//類外初始化,初始化時(shí)不加 static
int Person::sNum = 0;
int Person::sOther = 0;
int main(){//1. 通過類名直接訪問Person::sNum = 100;cout << "Person::sNum:" << Person::sNum << endl;//2. 通過對(duì)象訪問Person p1, p2;p1.sNum = 200;cout << "p1.sNum:" << p1.sNum << endl;cout << "p2.sNum:" << p2.sNum << endl;//3. 靜態(tài)成員也有訪問權(quán)限,類外不能訪問私有成員//cout << "Person::sOther:" << Person::sOther << endl;Person p3;//cout << "p3.sOther:" << p3.sOther << endl;system("pause");return 0;
}
靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)只能訪問靜態(tài)變量,不能訪問普通成員變量
靜態(tài)成員函數(shù)的使用和靜態(tài)成員變量一樣
靜態(tài)成員函數(shù)也有訪問權(quán)限
普通成員函數(shù)可訪問靜態(tài)成員變量、也可以訪問非經(jīng)常成員變量
class Person{public://普通成員函數(shù)可以訪問 static 和 non-static 成員屬性void changeParam1(int param){mParam = param;sNum = param;}//靜態(tài)成員函數(shù)只能訪問 static 成員屬性static void changeParam2(int param){//mParam = param; //無(wú)法訪問sNum = param;}private:static void changeParam3(int param){//mParam = param; //無(wú)法訪問sNum = param; }public:int mParam;static int sNum;
};
//靜態(tài)成員屬性類外初始化
int Person::sNum = 0;
int main(){//1. 類名直接調(diào)用Person::changeParam2(100);//2. 通過對(duì)象調(diào)用Person p;p.changeParam2(200);//3. 靜態(tài)成員函數(shù)也有訪問權(quán)限//Person::changeParam3(100); //類外無(wú)法訪問私有靜態(tài)成員函數(shù)//Person p1;//p1.changeParam3(200);return 0;
}
const 靜態(tài)成員屬性
const修飾的靜態(tài)成員變量保存在常量區(qū) 只讀權(quán)限 在內(nèi)存中只有一份
const修飾的靜態(tài)成員變量可以在類內(nèi)定義且初始化
const修飾的靜態(tài)成員變量可以通過類的定義域訪問
const修飾的靜態(tài)成員變量可以通過對(duì)象訪問
靜態(tài)成員函數(shù)可以訪問const修飾的靜態(tài)成員變量
#include <iostream>
#include <string.h>
using namespace std;class Person
{public:int a;//靜態(tài)成員變量不能再類內(nèi)初始化 類內(nèi)只能聲明 定義在全局 聲明的作用只是限制靜態(tài)變
量作用域static int b;//靜態(tài)成員變量 在編譯階段就被分配內(nèi)存 存在靜態(tài)全局區(qū)const static int c = 1000;//const 修飾的靜態(tài)全局變量 時(shí)保存在常量區(qū) 不可修改(只
讀) 在內(nèi)存中只有一份
};void test01()
{cout << Person::c << endl;Person p1;cout << p1.c << endl;
}
int main()
{test01();return 0;
}
靜態(tài)成員實(shí)現(xiàn)單例模式
單例模式:一個(gè)類只能創(chuàng)建出一個(gè)對(duì)象
單例模式實(shí)現(xiàn)的步驟:
? ? ? ? 1.將無(wú)參構(gòu)造私有化
? ? ? ? 2.將拷貝構(gòu)造私有化
? ? ? ? 3.定義一個(gè)靜態(tài)的成員指針變量
? ? ? ? 4.將靜態(tài)的成員指針變量私有化提供獲得唯一對(duì)象的地址接口
#include <iostream>
#include <string.h>using namespace std;class Person
{public:int age;int studenid;static Person* instance(){return single;}private:Person()//無(wú)參構(gòu)造私有化{}Person(const Person &p)//拷貝對(duì)象私有化{} static Person *single;
};Person *Person::single = new Person;void test03()
{ Person* p = Person::instance();p->age = 10;p->studenid = 20;Person* p1 = Person::instance();cout << p1->age<<""<<p1->studenid<<endl;}
void test02()
{ //Person::single->age = 100;//Person::single->studenid = 100;//Person p1(*Person::single);調(diào)用拷貝構(gòu)造實(shí)例化出一個(gè)對(duì)象
}int main()
{test03();return 0;
}