C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
類對(duì)象作為成員
C++類中的成員可以是另一個(gè)類的對(duì)象,我們稱該成員為 對(duì)象成員
例如:
class Phone {} class Person { Phone p; }
tips:當(dāng)類中成員是其他類對(duì)象時(shí),我們稱該成員為 對(duì)象成員
Person類中有對(duì)象p作為成員,Phone為對(duì)象成員,那么當(dāng)創(chuàng)建Person對(duì)象時(shí),Phone與Person的構(gòu)造和析構(gòu)的順序是誰(shuí)先誰(shuí)后?
那讓我們?cè)趦蓚€(gè)類中加上一些輸出語(yǔ)句做提示就好了,可以清晰的看到構(gòu)造和析構(gòu)的順序。
示例:
#include<iostream> using namespace std; //類對(duì)象作為類成員 class Phone { public: Phone(string P_name) { p_name = P_name; cout<<"Phone類有參構(gòu)造"<<endl; } ~Phone() { cout << "Phone析構(gòu)" << endl; } string p_name; }; class Person { public: Person(string m_Name,string p_Name):m_name(m_Name),m_PName(p_Name) { cout << "Person構(gòu)造" << endl;}//初始化列表 ~Person() { cout << "Person析構(gòu)" << endl; } string m_name; Phone m_PName; }; void test01() { Person p1("張三", "華為nova7"); Person p3(p1);//調(diào)用默認(rèn)拷貝構(gòu)造函數(shù) p3.m_name = "李白"; p3.m_PName.p_name = "iphone MAX"; cout << p1.m_name << "拿著" << p1.m_PName.p_name << endl; cout << p3.m_name << "拿著" << p3.m_PName.p_name << endl; } int main() { test01(); }
從結(jié)果圖中看出同時(shí)調(diào)用有參構(gòu)造的時(shí)候,先調(diào)用對(duì)象成員的構(gòu)造,再調(diào)用本類構(gòu)造
析構(gòu)的順序相反
靜態(tài)成員
定義和分類
靜態(tài)成員就是在成員變量和成員函數(shù)前加上關(guān)鍵字static,稱為靜態(tài)成員
靜態(tài)成員分為:
靜態(tài)成員變量
- 所有對(duì)象共享同一份數(shù)據(jù)
- 在編譯階段分配內(nèi)存
- 類內(nèi)聲明,類外初始化
靜態(tài)成員函數(shù)
- 所有對(duì)象共享同一個(gè)函數(shù)
- 靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)成員變量
靜態(tài)成員變量
class Person { public: static int m_A; private: static int m_B; }; int Person::m_A = 10; int Person::m_B = 10; void test01() { //靜態(tài)成員變量?jī)煞N訪問(wèn)方式 //1、通過(guò)對(duì)象 Person p1; p1.m_A = 100; cout << "p1.m_A = " << p1.m_A << endl; Person p2; p2.m_A = 200; cout << "p1.m_A = " << p1.m_A << endl; //共享同一份數(shù)據(jù) cout << "p2.m_A = " << p2.m_A << endl; //2、通過(guò)類名 cout << "m_A = " << Person::m_A << endl; //cout << "m_B = " << Person::m_B << endl; //私有權(quán)限訪問(wèn)不到 } int main() { test01(); system("pause"); return 0; }
靜態(tài)成員變量也是有訪問(wèn)權(quán)限的,無(wú)論是public或者是private在類內(nèi)都可以被訪問(wèn),m_A和m_B在類內(nèi)定義在類外初始化,還記得類外初始化嗎,就是變量類型加類名加::變量名=值;同時(shí)可以通過(guò)對(duì)象和類名兩種方式訪問(wèn)靜態(tài)成員變量。
靜態(tài)成員函數(shù)
class Person { public: int getB() { return m_B; } static int m_A; int m_C;//非靜態(tài)成員變量 //靜態(tài)成員函數(shù) static void func() { m_A = 100; //m_C = 20; cout << "static void func 的調(diào)用" << endl; } private: static int m_B; static void func2() { cout << "static void func 的調(diào)用" << endl; } }; int Person::m_A = 100;//類外外面初始化 int Person::m_B = 200; void test03() { //調(diào)用方式有兩種 //1、通過(guò)對(duì)象調(diào)用 Person p; p.func(); //通過(guò)類名調(diào)用 Person::func(); //類外訪問(wèn)不到靜態(tài)成員函數(shù),靜態(tài)成員函數(shù)也有訪問(wèn)權(quán)限 }
靜態(tài)成員函數(shù)也有權(quán)限的控制,代碼里寫了func是公共權(quán)限,func2是私有權(quán)限;靜態(tài)成員函數(shù)也有對(duì)象調(diào)用和類名調(diào)用兩種方式,但是都無(wú)法調(diào)用私有權(quán)限的靜態(tài)成員函數(shù)。
注意事項(xiàng):靜態(tài)成員函數(shù)不可以訪問(wèn)非靜態(tài)成員變量,無(wú)法區(qū)分到底是哪個(gè)對(duì)象的屬性,只有公用的靜態(tài)成員變量才可以被訪問(wèn)。
總結(jié)
熱烈慶祝對(duì)象的初始化和清理完工,作為C++核心編程比較重要的一部分,我也是認(rèn)真的總結(jié)了一遍,感覺(jué)很充實(shí),下篇博客直指this指針和成員變量以及成員函數(shù)的存儲(chǔ)問(wèn)題,期待你的鼓勵(lì),下篇再見(jiàn)!
到此這篇關(guān)于C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員的文章就介紹到這了,更多相關(guān)C++類的對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++文件的數(shù)據(jù)寫入和文件的數(shù)據(jù)讀取的方法實(shí)現(xiàn)
本文主要介紹了C++文件的數(shù)據(jù)寫入和文件的數(shù)據(jù)讀取的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06c語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀過(guò)程詳解
我們知道c語(yǔ)言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實(shí)main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過(guò)本文給大家分享c語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀過(guò)程,一起看看吧2021-08-08如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作
JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語(yǔ)言,在很多編程語(yǔ)言中都可以使用JSON,這篇文章主要介紹了在Qt中實(shí)現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下2023-08-08C語(yǔ)言枚舉(enum)和聯(lián)合(union)實(shí)例分享
在本篇文章里小編給大家整理了關(guān)于C語(yǔ)言枚舉(enum)和聯(lián)合(union)實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-03-03Qt5.9實(shí)現(xiàn)簡(jiǎn)單的多線程實(shí)例(類QThread)
Qt開啟多線程,主要用到類QThread。用一個(gè)類繼承QThread,然后重新改寫虛函數(shù)run()。具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09C++利用MySQL API連接和操作數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了C++利用MySQL API連接和操作數(shù)據(jù)庫(kù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01淺談C++中thread庫(kù)join和detach的區(qū)別
這篇文章主要為大家介紹了C++中thread庫(kù)join和detach的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-11-11