類和物件_物件的初始化和清理(下)
阿新 • • 發佈:2021-08-09
類與物件作為類成員
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(); //通過類名訪問 (不需要建立物件) }