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)的順序是誰先誰后?
那讓我們?cè)趦蓚€(gè)類中加上一些輸出語句做提示就好了,可以清晰的看到構(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ù)只能訪問靜態(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、通過對(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、通過類名
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í)可以通過對(duì)象和類名兩種方式訪問靜態(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、通過對(duì)象調(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ù)也有對(duì)象調(diào)用和類名調(diào)用兩種方式,但是都無法調(diào)用私有權(quán)限的靜態(tài)成員函數(shù)。
注意事項(xiàng):靜態(tài)成員函數(shù)不可以訪問非靜態(tài)成員變量,無法區(qū)分到底是哪個(gè)對(duì)象的屬性,只有公用的靜態(tài)成員變量才可以被訪問。
總結(jié)
熱烈慶祝對(duì)象的初始化和清理完工,作為C++核心編程比較重要的一部分,我也是認(rèn)真的總結(jié)了一遍,感覺很充實(shí),下篇博客直指this指針和成員變量以及成員函數(shù)的存儲(chǔ)問題,期待你的鼓勵(lì),下篇再見!
到此這篇關(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++中的動(dòng)態(tài)類型轉(zhuǎn)換與靜態(tài)類型轉(zhuǎn)換運(yùn)算符
這篇文章主要介紹了C++中的動(dòng)態(tài)類型轉(zhuǎn)換與靜態(tài)類型轉(zhuǎn)換運(yùn)算符,即dynamic_cast與static_cast的用法,需要的朋友可以參考下2016-01-01
C++實(shí)現(xiàn)讀入二進(jìn)制數(shù)并轉(zhuǎn)換為十進(jìn)制輸出
本文給大家介紹的是一則使用C++實(shí)現(xiàn)讀入二進(jìn)制數(shù)并轉(zhuǎn)換為十進(jìn)制輸出的代碼,實(shí)現(xiàn)起來其實(shí)非常簡單,C++本身就提供了二進(jìn)制類庫的,大家看代碼吧,簡單又實(shí)用。2015-03-03
解析C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承
這篇文章主要介紹了C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承,剖析虛函數(shù)和單個(gè)基類所能夠繼承的成員,要的朋友可以參考下2016-01-01
C語言實(shí)現(xiàn)俄羅斯方塊課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)俄羅斯方塊課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類
Qt中也有很多容器類,他們?cè)诖嫒∷俣?、?nèi)存開銷等方面進(jìn)行了優(yōu)化,使用起來更輕量級(jí)、更便捷,下面就跟隨小編一起來學(xué)習(xí)一下它們的具體使用吧2024-04-04
詳解C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法
這篇文章主要介紹了C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法,文中代碼有一個(gè)針對(duì)各種系統(tǒng)進(jìn)行判斷來加載不同頭文件的方法,需要的朋友可以參考下2016-03-03

