1. 程式人生 > 其它 >類和物件_物件的初始化和清理(下)

類和物件_物件的初始化和清理(下)

類與物件作為類成員

C++類中的成員可以是另一個類的物件,我們稱該成員為 物件成員

class A{}
class B {
    A a;
}

B類中物件A作為成員,A為物件成員

那麼當建立B物件時,A與B的構造和析構的順序?

在之前的類裡,先構造的後析構,後構造的先析構

#include <iostream>
#include <string>
using namespace std;

class Phone {
    public:
        Phone(string pName) {
             m_PName = pName;
        }
        
        
string m_PName; }; class Person { public: //Phone m_Phone = pName 隱式轉換 Person(string name, string pName) :m_Name(name), m_Phone(pName){ } string m_Name; Phone m_Phone; }; int main() { Person p("張三","蘋果"); cout << p.m_Name << "
" <<p.m_Phone.m_PName ; }

當其他類物件作為本類成員,構造時候先構造類物件,再構造自身;析構的順序:先構造的後析構

靜態成員

靜態成員就是在成員變數和成員函式前加上關鍵字static,稱為靜態成員

靜態成員分為:

  • 靜態成員變數
    • 所有物件共享同一份資料
    • 在編譯階段分配記憶體
    • 類內宣告,類外初始化
  • 靜態成員函式
    • 所有物件共享同一個函式
    • 靜態成員函式只能訪問靜態成員變數

靜態成員變數

#include <iostream>
#include <string>
using namespace std;

class Person {
    
public: //所有物件都共享一分資料 //編一階段就分配記憶體 //類內宣告 類外初始化操作 static int m_A; //靜態成員變數也是有訪問許可權的 private: static int m_B; }; int Person::m_A = 100; int Person::m_B = 10; int main() { Person p1; cout << p1.m_A << endl;; //100 Person p2; p2.m_A = 200; cout << p1.m_A << endl; //200 //靜態成員變數 不屬於某個物件上,所有物件都共享同一份資料 //訪問方式有兩種 //1、 通過物件訪問(如上) //2、 通過類名訪問 cout << Person::m_A << endl; //200 //cout << Person::m_B << endl; //無法訪問 }

靜態成員函式

#include <iostream>
#include <string>
using namespace std;

class Person {
    public:    
        //靜態成員函式 
        static void func() {
            m_A = 100; //靜態成員函式可以訪問 靜態成員變數 
            //m_B = 200;  //靜態成員函式 不可以訪問 非靜態成員變數,無法區分到底是哪個物件的 
            cout << "static void func呼叫"  << endl; 
        }
        
        static int m_A; //靜態成員變數 
        int m_B;        //非靜態成員變數 
        
        //靜態成員函式也有訪問許可權 
};

int Person::m_A = 0;

int main() { 
//    Person p;
//    p.func(); //通過物件訪問
    Person::func(); //通過類名訪問 (不需要建立物件) 
}