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

