靜態成員和友元
第1頁,此課件共28頁哦
引入
考慮一個學生管理系統,有時候需要向系統添加一個學生,有時候需要從系統中刪除一個學生。我們希望能夠隨時顯示該系統中的所有學生,并且能夠隨時獲取系統中的學生總數。
使用鏈表來存儲所有v
全局數據區
s_pListHead
Stack
p3
p2
p1
OS運行狀態
第8頁,此課件共28頁哦
6.2 靜態數據成員-初始化
類定義中只是聲明了靜態數據成員的存在(不會為其分配空間),還需要定義該靜態數據成員(為其分配內存空間)。
靜態數據成員的定義不能放在頭文件中,否則當多個源文件都包含該頭文件時,將產生重復定義的鏈接錯誤。
靜態數據成員的定義應該放在源文件中。
定義和初始化靜態數據成員的語法:
<靜態數據成員類型> <類名>::<靜態數據成員名>=<值>;
<靜態數據成員類型> <類名>::<靜態數據成員名>(<值>);
第9頁,此課件共28頁哦
靜態成員的初始化
// Student.h
class Student
{
public:
Student(char* name);
~Student();
private:
char m_name[20];
Student* m_pNext;
Student* m_pPrev;
static Student* s_pListHead;
static int s_nCount;
};
// Student.cpp
#include “student.h”
Student* Student::s_pListHead = NULL;
int Student::s_nCount = 0;
Student::Student(char* name)
{
…
}
Student::~Student()
{
…
}
第10頁,此課件共28頁哦
6.2 靜態數據成員
靜態數據成員的類型可以是其所屬類,而非靜態數據成員只能聲明為該類對象的指針或者引用。
class Student
{
public:
…
private:
static Student s_leader; // OK
Student* m_pLeader; // OK
Student m_leader; // ERROR
};
靜態數據成員從其行為上看和全局對象類似,但是使用靜態數據成員可以實現數據隱藏,靜態數據成員可以是private的,全局對象則不能。靜態數據成員不會和全局變量發生名字沖突。
第11頁,此課件共28頁哦
6.2 靜態數據成員-勘誤
教材P335的例子前的描述是不準確的。
如果說s.nextStudent未被執行,則程序運行的結果應該是0。
實際上此段代碼在VC6,VC.NET中的運行結果都是1;在Dev-C++環境中的運行結果是0;說明不同的編譯器會對此段代碼產生不同的結果。
所以在實際編程中,應該總是使用::的方式來訪問靜態數據成員。
【演示3】
第12頁,此課件共28頁哦
6.3 靜態成員函數-引入
使用static關鍵字修飾的成員函數。
靜態成員函數和靜態數據成員類似,不屬于任何對象,而是屬于類的。只要類存在就可以使用其靜態成員函數,與該類當前是否創建過對象或者創建了幾個對象無關。
靜態成員函數的定義和非靜態的成員函數定義一樣,在靜態成員函數定義時不能使用static。
第13頁,此課件共28頁哦
// Student.h
class Student
{
public:
Student(char* name);
~Student();
char* GetName();
static void PrintAllStudents();
private:
char m_name[20];
Student* m_pNext;
Student* m_pPrev;
static Student* m_pListHead;
};
// Student.cpp
#include “student.h”
Student* Student::m_pListHead=NULL;
Student::Student(char* name)
{ … }
Student::~Student()
{ … }
void Student::PrintAllStudents()
{ … }
第14頁,此課件共28頁哦
6.3 靜態成員函數-對象無關
靜態成員函數不與任何對象相聯系,因而靜態成員函數沒有this指針,即調用靜態成員函數時不會隱含的傳遞this指針。
因為靜態成員
內容來自淘豆網www.canything.com轉載請標明出處.