靜態

爱学习的小许?發表於2024-12-05

1.靜態成員變數
類內可以包含靜態成員,在變數型別前加static即可。

  • 靜態成員變數的特徵
    • 普通的成員屬於物件,而靜態成員變數不屬於物件
    • 不能在建構函式中定義和初始化,需要在類的外部單獨定義和初始化。
    • 靜態成員變數和全域性變數一樣存放在全域性區,可以把靜態成員變數理解成是被限制在類中去使
      用的全域性變數。
  • 使用方法:
    類名::靜態成員變數名;//推薦
    物件名.靜態成員變數名;//和上面方法本質一樣
string Student::s_name = "def";//不能在建構函式中定義和初始化,需要在類的外部單獨定義和初始
化。
  • 靜態成員變數在物件導向程式設計中有幾個重要的作用:
    資料共享:靜態成員變數是所有類的例項共享的,這意味著不論建立多少個物件,都只有一個靜態成員變數的副本。這使得靜態成員變數成為儲存與類本身相關而不是與特定物件相關的資料的理想選擇。
    記憶體管理:靜態成員變數在編譯階段分配記憶體,並在程式的生命週期內一直存在,直到程式結束。這種記憶體管理方式意味著靜態成員變數在整個程式執行期間都是可用的,並且不會因為物件的建立和銷燬而頻繁地分配和釋放記憶體。
    訪問限制:靜態成員變數可以透過類名直接訪問,而無需建立類的例項。這使得靜態成員變數可以在沒有物件上下文的情況下被訪問和修改。
    生命週期管理:靜態成員變數的生命週期與程式的執行時間相同,而不是與特定的物件例項的生命週期相同。這意味著靜態成員變數在程式開始執行時建立,並在程式結束時銷燬。
    最佳化效能:由於靜態成員變數只分配一次記憶體,並且在程式的整個生命週期內都保持存在,因此可以提高效能。此外,靜態成員變數在全域性資料區中分配記憶體,這有助於減少記憶體碎片。
    實現設計模式:靜態成員變數經常用於實現某些設計模式,如單例模式,其中靜態成員變數用於儲存類的唯一例項。
    需要注意的是,靜態成員變數有一些限制和約束。它們不能訪問非靜態成員變數或呼叫非靜態成員函式,因為非靜態成員需要物件例項的上下文。此外,靜態成員變數必須在類外部進行初始化,且只能初始化一次。

2.靜態成員函式

  • 格式:
class 類名
{
static 返回型別 函式名(形參表){...}
};
  • 靜態成員函式的特徵:
    靜態成員函式沒有this指標,沒有const屬性,但是可以過載(靜態與非靜態成員函式名字相同
    且引數相同不構成過載)

  • 訪問方式:

    • 類名::靜態成員函式(實參表);//推薦
    • 物件名.靜態成員函式(實參表);//和上面方法本質一樣

在靜態成員函式中只能訪問靜態成員,不能訪問普通成員,在普通的成員函式中,既可以訪問靜態
的成員也可以訪問普通的成員。

#include<iostream>
using namespace std;
class Student
{ 
public:
Student(int age = 0) :m_age(age)
{ }
public:
void fun1() const//在普通的成員函式中,既可以訪問靜態的成員也可以訪問普通的成員。
{
cout << "非靜態成員函式" << endl;
cout << "this->s_name = " << this->s_name << endl;
cout << "s_name = " << s_name << endl;
cout << "this->m_age = " << this->m_age << endl;
cout << "m_age = " << m_age << endl;
} 
static void fun2() /*const*///靜態成員函式沒有const屬性
{
cout << "靜態成員函式" << endl;
cout << "s_name = " << s_name << endl; //在靜態成員函式中只能訪問靜態成員, 不能
訪問普通成員
//cout << "m_age = " << m_age << endl;
//cout << "this->s_name = " << this->s_name << endl;//靜態成員函式沒有this指
針,沒有const屬性
}
private:
static string s_name;
int m_age;
};
string Student::s_name = "蔡徐坤";
int main()
{
Student stu(18);
cout << sizeof(Student) << endl;
stu.fun1();
cout << endl;
stu.fun2(); //物件名.靜態成員函式(實參表)
cout << endl;
Student::fun2(); //類名::靜態成員函式(實參表);
return 0;
}

靜態成員函式在C++和其他物件導向的程式語言中扮演著重要的角色。靜態成員函式具有幾個關鍵的特
性,使它們在某些場景下非常有用。以下是一些靜態成員函式的主要作用和優點:
1. 與類關聯而非物件關聯:靜態成員函式屬於類本身,而不是類的任何特定例項(物件)。這意味著
你可以在沒有建立類例項的情況下呼叫靜態成員函式。這種特性使得靜態成員函式可以在不需要訪問特定物件的狀態時執行操作。
2. 訪問靜態成員變數:靜態成員函式可以訪問靜態成員變數,這些變數也是與類關聯而不是與物件關聯的。這是靜態成員函式最常用的場景之一,因為它們可以用來操作類的靜態狀態。
3. 作為工廠函式:靜態成員函式經常用作工廠函式,負責建立和返回類的例項。這允許在類定義中封
裝物件的建立邏輯,而不是將責任留給外部程式碼。
4. 實現單例模式:在單例模式中,靜態成員函式通常用於確保類只有一個例項,並提供一個全域性訪問點。這是透過靜態成員函式來控制例項的建立和訪問來實現的。
5. 與非靜態成員函式的比較:靜態成員函式不能訪問類的非靜態成員變數或呼叫非靜態成員函式,因為它們需要類例項的上下文。相反,非靜態成員函式可以訪問靜態和非靜態成員,因為它們有一隱式的 this 指標,指向呼叫該方法的物件例項。
6. 效能最佳化:由於靜態成員函式不依賴於物件例項,因此在某些情況下,它們可能比非靜態成員函式具有更好的效能。然而,這種效能差異通常在現代編譯器和硬體架構下是微不足道的,因此在決定使用靜態成員函式時,效能通常不是主要考慮因素。