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

C++ 類的定義和實例化全解

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

1.類的定義

1.1 類定義格式

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

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

class Date 
{ 
public:
	void Init(int year, int month, int day) 
    {
        _year = year; 
        _month = month;
        _day = day; 
    }
private: 
    // 為了區(qū)分成員變量,?般習慣上成員變量
    // 會加?個特殊標識,如_ 或者 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的?法,同時struct升級成了類,明顯的變化是 struct中可以定義函數(shù),?般情況下我們還是推薦?class定義類。

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

• 定義在類里?的成員函數(shù)默認為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申請空間失敗"); 
            return; 
        } 
        capacity = n; 
        top = 0; 
    } 
    void Push(int x) 
    {
        // ...擴容  
        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; 
}; // 分號不能省略  
int main() 
{ 
    Stack st; 
    st.Init();
    st.Push(1); 
    st.Push(2);
    cout << st.Top() << endl;
    st.Destroy();
    return 0; 
}

1.2 訪問限定符

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

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

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

• class定義成員沒有被訪問限定符修飾時默認為private,struct默認為public。

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

1.3 類域

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

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

//.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申請空間失敗");
        return;
    }
    capacity = n;
    top = 0; 
} 
int main() 
{ 
    Stack st; 
    st.Init();
    return 0;
}

2. 實例化

2.1 實例化概念

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

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

• ?個類可以實例化出多個對象,實例化出的對象占?實際的物理空間,存儲類成員變量。

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

一張圖紙可以建造多個房子,一個類可以有多個實例化對象

#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類實例化出對象d1和d2(整體定義)  
    Date d1; 
    Date d2; 
    d1.Init(2024, 3, 31);
    d1.Print(); 
    d2.Init(2024, 7, 5);
    d2.Print(); 
    return 0; 
} 

2.2 對象??

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

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

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

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

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

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

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

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

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

VS中默認的對?數(shù)為8

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

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

// 計算?下A/B/C實例化的對象是多?? 
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;
}

上?的程序運?后,我們看到?jīng)]有成員變量的B和C類對象的??是1,為什么沒有成員變量還要給1個字節(jié)呢?因為如果?個字節(jié)都不給,怎么表?對象存在過呢!所以這?給1字節(jié),純粹是為了占位標識對象存在。

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

相關(guān)文章

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

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

    時間復雜度一般指時間復雜性。?在計算機科學中,時間復雜性,又稱時間復雜度,算法的時間復雜度是一個函數(shù),它定性描述該算法的運行時間
    2022-03-03
  • Qt使用Json的項目實踐

    Qt使用Json的項目實踐

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

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

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

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

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    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)鏈表全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步,早日升職加薪
    2021-10-10
  • C++強制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_cast)

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

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

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

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

    一起來學習C++中類的this指針以使用

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

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

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

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

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

最新評論

兴隆县| 时尚| 棋牌| 岐山县| 海南省| 定州市| 木兰县| 琼海市| 屏山县| 介休市| 土默特左旗| 漳州市| 山丹县| 思南县| 丽江市| 宜章县| 清远市| 高要市| 沂水县| 芜湖县| 盘锦市| 子长县| 英德市| 呼伦贝尔市| 凉城县| 黔西县| 仙游县| 牡丹江市| 丹东市| 祁连县| 宁化县| 科技| 高要市| 黄山市| 南通市| 崇州市| 洪泽县| 邛崃市| 科尔| 扶沟县| 吴忠市|