最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 類的定義和實(shí)例化全解

 更新時(shí)間:2026年04月13日 10:37:27   作者:王璐WL  
文章主要介紹了C++中類的定義、成員、訪問權(quán)限、類域等概念,以及對(duì)象實(shí)例化的過程和對(duì)象大小分析,類中成員變量和函數(shù)有訪問權(quán)限修飾符,感興趣的朋友跟隨小編

1.類的定義

1.1 類定義格式

• class為定義類的關(guān)鍵字,Stack為類的名字,{}中為類的主體,注意類定義結(jié)束時(shí)后?分號(hào)不能省略。類體中內(nèi)容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數(shù)稱為類的?法或者成員函數(shù)。

• 為了區(qū)分成員變量,?般習(xí)慣上成員變量會(huì)加?個(gè)特殊標(biāo)識(shí),如成員變量前?或者后?加_或者m 開頭,注意C++中這個(gè)并不是強(qiáng)制的,只是?些慣例,具體看公司的要求。

class Date 
{ 
public:
	void Init(int year, int month, int day) 
    {
        _year = year; 
        _month = month;
        _day = day; 
    }
private: 
    // 為了區(qū)分成員變量,?般習(xí)慣上成員變量
    // 會(huì)加?個(gè)特殊標(biāo)識(shí),如_ 或者 m開頭  
    int _year; // year_   m_year
    int _month;
    int _day; 
};
int main() 
{
    Date d; 
    d.Init(2024, 3, 31); 
    return 0;
}

主流的兩種區(qū)分方法

駝峰法:

類型和函數(shù)首字母大寫開頭(如果是單詞,則首字母大寫開頭+單詞首字母大寫,如StackInit)

變量首字母小寫(單詞首字母小寫開頭+單詞首字母大寫,如initCapacity)

第二種方法

stack_init

init_capacity

C++中struct也可以定義類,C++兼容C中struct的?法,同時(shí)struct升級(jí)成了類,明顯的變化是 struct中可以定義函數(shù),?般情況下我們還是推薦?class定義類。

struct A
{
	int a1;
	int a2;
	void Init();
};
int main()
{
    struct A aa1;//兼容了c
	A aa2;//升級(jí)成了類
    aa2.Init();//調(diào)用
	return 0;
}
#include<iostream>
using namespace std; 
// C++升級(jí)struct升級(jí)成了類 
// 1、類??可以定義函數(shù)  
// 2、struct名稱就可以代表類型 
typedef struct ListNodeC 
{ 
    //cpp中ListNodeC就可以代表類型,不需要寫成下面那樣
    //struct ListNodeC* next; 
    ListNodeC* next;
    int val; 
}LTNode; 

• 定義在類里?的成員函數(shù)默認(rèn)為inline。

#include<iostream> 
using namespace std;
class Stack 
{ 
public: 
    // 成員函數(shù)  
    void Init(int n = 4) 
    { 
        arr = (int*)malloc(sizeof(int) * n); 
        if (nullptr == arr) 
        { 
            perror("malloc申請(qǐng)空間失敗"); 
            return; 
        } 
        capacity = n; 
        top = 0; 
    } 
    void Push(int x) 
    {
        // ...擴(kuò)容  
        arr[top++] = x;
    } 
    int Top() 
    { 
        assert(top > 0); 
        return arr[top - 1]; 
    } 
    void Destroy() 
    {
        free(arr);
        arr = nullptr; 
        top = capacity = 0; 
    }
private: 
    // 成員變量  
    int* arr; 
    size_t capacity;
    size_t top; 
}; // 分號(hào)不能省略  
int main() 
{ 
    Stack st; 
    st.Init();
    st.Push(1); 
    st.Push(2);
    cout << st.Top() << endl;
    st.Destroy();
    return 0; 
}

1.2 訪問限定符

• C++?種實(shí)現(xiàn)封裝的?式,?類將對(duì)象的屬性與?法結(jié)合在?塊,讓對(duì)象更加完善,通過訪問權(quán)限選擇性的將其接?提供給外部的??使?。

• public修飾的成員在類外可以直接被訪問;protected和private修飾的成員在類外不能直接被訪問,protected和private目前認(rèn)為是一樣的,以后繼承章節(jié)才能體現(xiàn)出他們的區(qū)別。

• 訪問權(quán)限作?域從該訪問限定符出現(xiàn)的位置開始直到下?個(gè)訪問限定符出現(xiàn)時(shí)為?,如果后?沒有訪問限定符,作?域就到}即類結(jié)束。

• class定義成員沒有被訪問限定符修飾時(shí)默認(rèn)為private,struct默認(rèn)為public。

• ?般成員變量都會(huì)被限制為private/protected,需要給別?使?的成員函數(shù)會(huì)放為public。

1.3 類域

• 類定義了?個(gè)新的作?域,類的所有成員都在類的作?域中,在類體外定義成員時(shí),需要使?::作?域操作符指明成員屬于哪個(gè)類域。

• 類域影響的是編譯的查找規(guī)則,下?程序中Init如果不指定類域Stack,那么編譯器就把Init當(dāng)成全局函數(shù),那么編譯時(shí)找不到arr等成員的聲明/定義在哪?,就會(huì)報(bào)錯(cuò)。指定類域Stack,就是知道Init是成員函數(shù),當(dāng)前域找不到的arr等成員,就會(huì)到類域中去查找。

//.h
class Stack 
{ 
public:
 // 成員函數(shù)  
    void Init(int n = 4); 
    private:
    // 成員變量  
    int* arr; 
    size_t capacity; 
    size_t top; 
}; 
// 聲明和定義分離,需要指定類域  
//.cpp
void Stack::Init(int n)
{ 
    arr = (int*)malloc(sizeof(int) * n); 
    if (nullptr == arr) 
    {
        perror("malloc申請(qǐng)空間失敗");
        return;
    }
    capacity = n;
    top = 0; 
} 
int main() 
{ 
    Stack st; 
    st.Init();
    return 0;
}

2. 實(shí)例化

2.1 實(shí)例化概念

• ?類類型在物理內(nèi)存中創(chuàng)建對(duì)象的過程,稱為類實(shí)例化出對(duì)象。

• 類是對(duì)象進(jìn)??種抽象描述,是?個(gè)模型?樣的東西,限定了類有哪些成員變量,這些成員變量只是聲明,沒有分配空間,?類實(shí)例化出對(duì)象時(shí),才會(huì)分配空間。

• ?個(gè)類可以實(shí)例化出多個(gè)對(duì)象,實(shí)例化出的對(duì)象占?實(shí)際的物理空間,存儲(chǔ)類成員變量。

打個(gè)??:類實(shí)例化出對(duì)象就像現(xiàn)實(shí)中使?建筑設(shè)計(jì)圖建造出房?,類就像是設(shè)計(jì)圖,設(shè)計(jì)圖規(guī)劃了有多少個(gè)房間,房間??功能等,但是并沒有實(shí)體的建筑存在,也不能住?,?設(shè)計(jì)圖修建出房?,房?才能住?。同樣類就像設(shè)計(jì)圖?樣,不能存儲(chǔ)數(shù)據(jù),實(shí)例化出的對(duì)象分配物理內(nèi)存存儲(chǔ)數(shù)據(jù)。

一張圖紙可以建造多個(gè)房子,一個(gè)類可以有多個(gè)實(shí)例化對(duì)象

#include<iostream> 
using namespace std;
class Date
{
public:
    void Init(int year, int month, int day) 
    {
        _year = year; 
        _month = month; 
        _day = day;
    }
    void Print() 
    { 
        cout << _year << "/" << _month << "/" << _day << endl; 
    } 
private: 
    // 這?只是聲明,沒有開空間 
    int _year; 
    int _month; 
    int _day; 
}; 
int main() 
{
    // Date類實(shí)例化出對(duì)象d1和d2(整體定義)  
    Date d1; 
    Date d2; 
    d1.Init(2024, 3, 31);
    d1.Print(); 
    d2.Init(2024, 7, 5);
    d2.Print(); 
    return 0; 
} 

2.2 對(duì)象??

分析?下類對(duì)象中哪些成員呢?類實(shí)例化出的每個(gè)對(duì)象,都有獨(dú)?的數(shù)據(jù)空間,所以對(duì)象中肯定包含成員變量,那么成員函數(shù)是否包含呢?

?先函數(shù)被編譯后是?段指令,對(duì)象中沒辦法存儲(chǔ),這些指令存儲(chǔ)在?個(gè)單獨(dú)的區(qū)域(代碼段),那么對(duì)象中?要存儲(chǔ)的話,只能是成員函數(shù)的指針。再分析?下,對(duì)象中是否有存儲(chǔ)指針的必要呢?

Date實(shí)例化d1和d2兩個(gè)對(duì)象,d1和d2都有各?獨(dú)?的成員變量 _year/_month/_day存儲(chǔ)各?的數(shù)據(jù),但是d1和d2的成員函數(shù)Init/Print指針卻是?樣的,存儲(chǔ)在對(duì)象中就浪費(fèi)空間。當(dāng)?Date實(shí)例化100個(gè)對(duì)象,那么成員函數(shù)指針就重復(fù)存儲(chǔ)100次,太浪費(fèi)了。

這?需要再額外多說?下,其實(shí)函數(shù)指針是不需要存儲(chǔ)的,函數(shù)指針是?個(gè)地址,調(diào)?函數(shù)被編譯成匯編指令[call地址],其實(shí)編譯器在編譯鏈接時(shí),就要找到函數(shù)的地址,不是在運(yùn)?時(shí)找(只有動(dòng)態(tài)多態(tài)是在運(yùn)?時(shí)找,就需要存儲(chǔ)函數(shù)地址,這個(gè)我們以后會(huì)講解),所以不用存指針(也就是函數(shù)地址),編譯器可以找到。

上?我們分析了對(duì)象中只存儲(chǔ)成員變量,C++規(guī)定類實(shí)例化的對(duì)象也要符合內(nèi)存對(duì)?的規(guī)則。

內(nèi)存對(duì)?規(guī)則

• 第?個(gè)成員在與結(jié)構(gòu)體偏移量為0的地址處。

• 其他成員變量要對(duì)?到某個(gè)數(shù)字(對(duì)?數(shù))的整數(shù)倍的地址處。

注意:對(duì)?數(shù)=編譯器默認(rèn)的?個(gè)對(duì)?數(shù)與該成員??的較?值。

VS中默認(rèn)的對(duì)?數(shù)為8

結(jié)構(gòu)體總??為:最?對(duì)?數(shù)(所有成員變量的對(duì)齊數(shù)中的最大值)的整數(shù)倍。

• 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)?到??的最?對(duì)?數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體??就是所有最?對(duì)?數(shù)(含嵌套結(jié)構(gòu)體的對(duì)?數(shù))的整數(shù)倍。

// 計(jì)算?下A/B/C實(shí)例化的對(duì)象是多?? 
class A
{
public: 
    void Print() 
    { 
        cout << _ch << endl;
    }
private: 
    char _ch;
    int _i;
};
class B 
{ 
public: 
    void Print()
    { 
        //... 
    } 
}; 
class C 
{}; 
int main() 
{ 
    A a; 
    B b; 
    C c; 
    cout << sizeof(a) << endl;//8
    cout << sizeof(b) << endl; 
    cout << sizeof(c) << endl; 
    return 0;
}

上?的程序運(yùn)?后,我們看到?jīng)]有成員變量的B和C類對(duì)象的??是1,為什么沒有成員變量還要給1個(gè)字節(jié)呢?因?yàn)槿绻?個(gè)字節(jié)都不給,怎么表?對(duì)象存在過呢!所以這?給1字節(jié),純粹是為了占位標(biāo)識(shí)對(duì)象存在。

到此這篇關(guān)于C++ 類的定義和實(shí)例化的文章就介紹到這了,更多相關(guān)C++類的定義和實(shí)例化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++?超詳細(xì)分析數(shù)據(jù)結(jié)構(gòu)中的時(shí)間復(fù)雜度

    C++?超詳細(xì)分析數(shù)據(jù)結(jié)構(gòu)中的時(shí)間復(fù)雜度

    時(shí)間復(fù)雜度一般指時(shí)間復(fù)雜性。?在計(jì)算機(jī)科學(xué)中,時(shí)間復(fù)雜性,又稱時(shí)間復(fù)雜度,算法的時(shí)間復(fù)雜度是一個(gè)函數(shù),它定性描述該算法的運(yùn)行時(shí)間
    2022-03-03
  • Qt使用Json的項(xiàng)目實(shí)踐

    Qt使用Json的項(xiàng)目實(shí)踐

    JSON是一種對(duì)源自Javascript的對(duì)象數(shù)據(jù)進(jìn)行編碼的格式,但現(xiàn)在被廣泛用作互聯(lián)網(wǎng)上的數(shù)據(jù)交換格式,本文主要介紹了Qt使用Json的項(xiàng)目實(shí)踐,詳細(xì)的介紹了主要使用的類以及Json實(shí)戰(zhàn),感興趣的可以了解一下
    2023-09-09
  • C語言中程序環(huán)境和預(yù)處理的詳細(xì)圖文講解

    C語言中程序環(huán)境和預(yù)處理的詳細(xì)圖文講解

    這篇文章主要給大家介紹了關(guān)于C語言中程序環(huán)境和預(yù)處理的相關(guān)資料,我們寫的C語言代碼,從運(yùn)行,到在屏幕上生成結(jié)果,經(jīng)歷了比較復(fù)雜的過程,需要的朋友可以參考下
    2023-02-02
  • C語言修煉之路數(shù)據(jù)類型悟正法?解析存儲(chǔ)定風(fēng)魔上篇

    C語言修煉之路數(shù)據(jù)類型悟正法?解析存儲(chǔ)定風(fēng)魔上篇

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-02-02
  • C語言編程數(shù)據(jù)結(jié)構(gòu)帶頭雙向循環(huán)鏈表全面詳解

    C語言編程數(shù)據(jù)結(jié)構(gòu)帶頭雙向循環(huán)鏈表全面詳解

    這篇文章主要為大家介紹了C語言編程的數(shù)據(jù)結(jié)構(gòu)中帶頭雙向循環(huán)鏈表全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2021-10-10
  • C++強(qiáng)制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_cast)

    C++強(qiáng)制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_ca

    本文主要介紹了C++強(qiáng)制類型轉(zhuǎn)換,主要介紹了static_cast、dynamic_cast、const_cast、reinterpret_cast的4種方法,感興趣的可以了解一下
    2021-08-08
  • C++中如何修改const變量你知道嗎

    C++中如何修改const變量你知道嗎

    這篇文章主要為大家詳細(xì)介紹了C++修改const變量,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 一起來學(xué)習(xí)C++中類的this指針以使用

    一起來學(xué)習(xí)C++中類的this指針以使用

    這篇文章主要為大家詳細(xì)介紹了C++中類的this指針以使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 一張圖總結(jié)C++中關(guān)于指針的那些事

    一張圖總結(jié)C++中關(guān)于指針的那些事

    今天小編就為大家分享一篇關(guān)于一圖總結(jié)C++中關(guān)于指針的那些事,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • c++傳遞函數(shù)指針和bind的示例

    c++傳遞函數(shù)指針和bind的示例

    這篇文章主要介紹了c++傳遞函數(shù)指針和bind的示例,需要的朋友可以參考下
    2014-05-05

最新評(píng)論

亚东县| 大同县| 祁连县| 分宜县| 揭东县| 徐水县| 澄迈县| 德州市| 张家港市| 宁乡县| 富宁县| 宜都市| 钟山县| 武清区| 玉林市| 土默特左旗| 保亭| 清远市| 嘉峪关市| 靖江市| 库伦旗| 奉化市| 孙吴县| 渝中区| 涪陵区| 平潭县| 凤凰县| 通山县| 固安县| 横山县| 个旧市| 修武县| 澜沧| 谷城县| 新和县| 东平县| 舟山市| 扎囊县| 台北市| 常宁市| 绥江县|