0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++中的類的定義和聲明

jf_78858299 ? 來源:月下西樓 ? 作者: QStack ? 2023-04-06 14:42 ? 次閱讀

背景

當我們在編寫程序時,經(jīng)常需要定義一些數(shù)據(jù)類型,這些數(shù)據(jù)類型可以封裝數(shù)據(jù)和函數(shù),以便我們更好地組織和管理代碼。C++中的類就是一種用于定義新的數(shù)據(jù)類型的機制,它允許我們將數(shù)據(jù)和函數(shù)封裝在一起,形成一個獨立的模塊,這個模塊可以被其他代碼重復使用。

類的定義和聲明

類是一種用戶自定義的數(shù)據(jù)類型,它可以包含數(shù)據(jù)成員和成員函數(shù)。數(shù)據(jù)成員是類的屬性,成員函數(shù)是類的行為。類定義了一種新的數(shù)據(jù)類型,我們可以使用這種數(shù)據(jù)類型來創(chuàng)建對象,每個對象都有自己的數(shù)據(jù)成員和成員函數(shù),在C++中,我們使用class關(guān)鍵字來定義一個類。類的定義包括類名、數(shù)據(jù)成員和成員函數(shù)。下面是一個簡單的類定義的例子:

class Person {
public:
    // 成員函數(shù)
    void sayHello() {
        std::cout << "Hello, world!" << std::endl;
    }
private:
    // 數(shù)據(jù)成員
    std::string name;
    int age;
};

在這個例子中,我們定義了一個名為Person的類,它有一個公有成員函數(shù)sayHello和兩個私有數(shù)據(jù)成員name和age。公有成員函數(shù)可以被任何代碼訪問,而私有數(shù)據(jù)成員只能被類的成員函數(shù)訪問。

構(gòu)造函數(shù)

在C++中,構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于初始化對象的數(shù)據(jù)成員。構(gòu)造函數(shù)的名稱與類的名稱相同,沒有返回類型,可以有參數(shù)。當創(chuàng)建一個對象時,構(gòu)造函數(shù)會自動調(diào)用,以初始化對象的數(shù)據(jù)成員。

class MyClass {
public:
    int publicVar;
    MyClass(int var) {
        publicVar = var;
    }
};

在上面的示例中,MyClass類有一個帶有一個整數(shù)參數(shù)的構(gòu)造函數(shù),用于初始化publicVar數(shù)據(jù)成員。當創(chuàng)建一個MyClass對象時,可以傳遞一個整數(shù)參數(shù)來調(diào)用構(gòu)造函數(shù),以初始化publicVar數(shù)據(jù)成員。

?需要注意的是,如果一個類沒有定義構(gòu)造函數(shù),則編譯器會自動生成一個默認構(gòu)造函數(shù)。默認構(gòu)造函數(shù)沒有參數(shù),不執(zhí)行任何操作,只是將對象的數(shù)據(jù)成員初始化為默認值。

?

如果一個類有多個構(gòu)造函數(shù),則可以使用函數(shù)重載來實現(xiàn)。函數(shù)重載是指在同一個作用域內(nèi)定義多個函數(shù),它們具有相同的名稱但不同的參數(shù)列表。當調(diào)用一個重載函數(shù)時,編譯器會根據(jù)傳遞的參數(shù)類型和數(shù)量來確定要調(diào)用哪個函數(shù)。

class MyClass {
public:
    int publicVar;
    MyClass() {
        publicVar = 0;
    }
    MyClass(int var) {
        publicVar = var;
    }
};

在上面的示例中,MyClass類有兩個構(gòu)造函數(shù),一個是默認構(gòu)造函數(shù),另一個是帶有一個整數(shù)參數(shù)的構(gòu)造函數(shù)。當創(chuàng)建一個MyClass對象時,可以選擇調(diào)用哪個構(gòu)造函數(shù)來初始化publicVar數(shù)據(jù)成員。

析構(gòu)函數(shù)

C++中的析構(gòu)函數(shù)(Destructor)是一種特殊的成員函數(shù),它在對象被銷毀時自動調(diào)用。它的作用是釋放對象占用的資源,比如堆上的內(nèi)存、文件句柄、數(shù)據(jù)庫連接等等。

C++中的析構(gòu)函數(shù)使用一個波浪線(~)作為前綴,后跟類的名稱。它不接受任何參數(shù),也沒有返回值,因為它的主要作用是在對象被銷毀時自動執(zhí)行。析構(gòu)函數(shù)的名稱與類名稱相同,但前面有一個波浪線符號。

例如,下面是一個簡單的類和它的析構(gòu)函數(shù)的示例:

class MyClass {
public:
    // 構(gòu)造函數(shù)
    MyClass() {
        // 構(gòu)造函數(shù)代碼
    }

    // 析構(gòu)函數(shù)
    ~MyClass() {
        // 析構(gòu)函數(shù)代碼
    }
};

當程序中創(chuàng)建一個MyClass對象時,構(gòu)造函數(shù)將被自動調(diào)用以初始化對象。當對象的生命周期結(jié)束時,析構(gòu)函數(shù)將自動調(diào)用以清理對象所占用的資源。

?需要注意的是,當一個對象被銷毀時,它的析構(gòu)函數(shù)會自動遞歸調(diào)用所有成員變量的析構(gòu)函數(shù),直到所有占用的資源都被釋放為止。如果一個類中有指向堆上分配的內(nèi)存的指針,需要在析構(gòu)函數(shù)中手動釋放這些內(nèi)存,以避免內(nèi)存泄漏。

?

實例化

在C++中,要實例化一個類,你需要創(chuàng)建該類的對象。這可以通過聲明一個類類型的變量,然后使用new關(guān)鍵字調(diào)用構(gòu)造函數(shù)來完成。例如,如果你有一個名為MyClass的類,你可以按如下方式創(chuàng)建該類的對象:

MyClass* obj = new MyClass();

這將創(chuàng)建一個MyClass類的新對象,并返回指向該對象的指針。然后,你可以使用->運算符訪問對象的公共成員。例如,如果MyClass有一個名為publicVar的公共成員,你可以按如下方式訪問它:

obj->publicVar = 42;

另外,你也可以不使用new關(guān)鍵字創(chuàng)建該類的對象。例如:

MyClass obj;

這將在堆棧上創(chuàng)建一個MyClass類的新對象。然后,你可以使用.運算符訪問對象的公共成員。例如:

obj.publicVar = 42;

訪問控制

訪問控制是C++中類的一個重要概念,用于控制成員的訪問權(quán)限。C++中的類可以使用public、private和protected關(guān)鍵字來控制成員的訪問權(quán)限。其中,public成員可以被任何人訪問,private成員只能被類的成員函數(shù)訪問,protected成員可以被類的成員函數(shù)和派生類的成員函數(shù)訪問。

友元函數(shù)

在C++中,友元函數(shù)是一種特殊的函數(shù),它可以訪問一個類的私有成員和保護成員。友元函數(shù)并不是類的成員函數(shù),因此它不能使用成員訪問運算符.或->來訪問類的成員。相反,它必須使用傳遞給它的類對象的引用來訪問類的成員。

友元函數(shù)的聲明需要在類的定義中進行,使用friend關(guān)鍵字。例如:

class MyClass {
private:
    int privateVar;
    friend void friendFunc(MyClass& obj); // 聲明友元函數(shù)
};

在這個例子中,friendFunc是一個友元函數(shù),可以訪問MyClass的私有成員privateVar。注意,友元函數(shù)并不是MyClass的成員函數(shù),因此它不能使用成員訪問運算符.或->來訪問MyClass的成員。相反,它必須使用傳遞給它的MyClass對象的引用來訪問MyClass的成員。例如:

void friendFunc(MyClass& obj) {
    obj.privateVar = 42; // 可以訪問私有成員
}

在這個例子中,friendFunc可以訪問MyClass的私有成員privateVar,因為它被聲明為MyClass的友元函數(shù)。注意,friendFunc使用傳遞給它的MyClass對象的引用來訪問MyClass的成員。

友元函數(shù)可以是全局函數(shù),也可以是其他類的成員函數(shù)。如果友元函數(shù)是其他類的成員函數(shù),那么這個類必須先被定義。例如,在以下代碼中,例如:

class MyClass {
private:
    int privateVar;
    friend void friendFunc(MyClass& obj); // 聲明全局友元函數(shù)
    friend class FriendClass; // 聲明其他類的友元類
};

void friendFunc(MyClass& obj) {
    obj.privateVar = 1; // 可以訪問MyClass的私有成員
}

class FriendClass {
public:
    void friendFunc(MyClass& obj) {
        obj.privateVar = 2; // 可以訪問MyClass的私有成員
    }
};

FriendClass的成員函數(shù)friendFunc被聲明為MyClass的友元函數(shù),因此它可以訪問MyClass的私有成員privateVar。注意,這里的聲明需要在FriendClass的定義之后進行。此外,需要注意的是,友元函數(shù)的聲明只是告訴編譯器這個函數(shù)是一個友元函數(shù),它并不會影響函數(shù)的調(diào)用方式。因此,在調(diào)用友元函數(shù)時,仍然需要使用傳遞給它的類對象的引用來訪問類的成員。例如,在以下代碼中:

class MyClass {
private:
    int privateVar;
    friend void friendFunc(MyClass& obj); // 聲明全局友元函數(shù)
};

void friendFunc(MyClass& obj) {
    obj.privateVar = 1; // 可以訪問MyClass的私有成員
}

int main() {
    MyClass obj;
    friendFunc(obj); // 調(diào)用友元函數(shù)
    return 0;
}

雖然friendFunc是一個全局友元函數(shù),可以訪問MyClass的私有成員privateVar,但在調(diào)用friendFunc時仍然需要使用傳遞給它的MyClass對象的引用來訪問MyClass的成員。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4261

    瀏覽量

    62233
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73406
  • 數(shù)據(jù)類型
    +關(guān)注

    關(guān)注

    0

    文章

    236

    瀏覽量

    13582
收藏 人收藏

    評論

    相關(guān)推薦

    C++的結(jié)構(gòu)和

    。C++ 有結(jié)構(gòu),就像 C 一樣,因為它們是不一樣的。C++,它們與結(jié)構(gòu)非常相似。本文解開這些語言元素的細節(jié)。
    發(fā)表于 07-18 17:37 ?770次閱讀

    c++冒號(:)和雙冒號(::)的用法

    ()——————————————————————————————————————VC如下::是C++里的“作用域分解運算符”。比如聲明了一個A,
    發(fā)表于 10-18 10:08

    CC++const的用法比較

    const的定義放在頭文件。也就是說const在C++是內(nèi)連接的,不會在多個編譯單元之間發(fā)生沖突。如果想聲明在別的地方
    發(fā)表于 11-11 10:00

    C++筆記004:C++通俗點說—— C結(jié)構(gòu)體復習

    ”。-----------------------------------------------------C++定義前面看明白了,這個地方就不多說話!將結(jié)構(gòu)體定義
    發(fā)表于 03-05 12:53

    C++語言基礎(chǔ)講解視頻常量的定義和使用

    C++語言基礎(chǔ)講解視頻常量的定義和使用,喜歡的朋友可以下載來學習。
    發(fā)表于 01-14 15:30 ?4次下載

    變量定義和聲明的區(qū)別

    我們在程序設(shè)計,時時刻刻都用到變量的定義和變量的聲明,可有些時候我們對這個概念不是很清楚,知道它是怎么用,但卻不知是怎么一會事,下面我就簡單的把他們的區(qū)別介紹如下:
    發(fā)表于 11-17 08:38 ?1w次閱讀

    高質(zhì)量C++C編程指南資料說明

    每個 C++/C 程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration),稱為頭文件。另一個文件用于保存程序的實現(xiàn)(implementation),稱為定義(def
    發(fā)表于 03-14 08:00 ?2次下載

    C語言的聲明定義與引用說明

    本文檔的主要內(nèi)容詳細介紹的是C語言的聲明定義與引用說明
    發(fā)表于 07-29 08:00 ?2次下載
    <b class='flag-5'>C</b>語言的<b class='flag-5'>聲明</b>和<b class='flag-5'>定義</b>與引用說明

    C++的繼承訪問級別學習總結(jié)(二)

    上一篇文章我們介紹了c++的繼承學習總結(jié);今天我們繼續(xù)來分享c++的繼承
    的頭像 發(fā)表于 12-24 16:10 ?685次閱讀

    EE-128:C++的DSP:從C++調(diào)用匯編成員函數(shù)

    EE-128:C++的DSP:從C++調(diào)用匯編成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b><b class='flag-5'>中</b>的DSP:從<b class='flag-5'>C++</b>調(diào)用匯編<b class='flag-5'>類</b>成員函數(shù)

    EE-112:模擬C++實現(xiàn)

    EE-112:模擬C++實現(xiàn)
    發(fā)表于 05-27 16:13 ?2次下載
    EE-112:模擬<b class='flag-5'>C++</b><b class='flag-5'>中</b>的<b class='flag-5'>類</b>實現(xiàn)

    高質(zhì)量C++/C編程指南

    高質(zhì)量C++/C編程指南免費下載。每個 C++/C 程序通常分為兩個文件。一個文件用于保存程序的聲明(declaration),稱為頭文件。
    發(fā)表于 03-31 14:15 ?33次下載

    虛函數(shù),C++開發(fā)者如何有效利用

    虛函數(shù)是基聲明的成員函數(shù),且使用者期望在派生中將其重新定義。那么,在 C++
    的頭像 發(fā)表于 02-11 09:39 ?867次閱讀

    C語言如何定義結(jié)構(gòu)體類型變量

    定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。根據(jù)結(jié)構(gòu)體類型包含的成員情況,在Visual C++占63個字節(jié)。 * 這種聲明方式是
    的頭像 發(fā)表于 03-10 15:35 ?1139次閱讀

    ostream在c++的用法

    ostream 是 C++ 標準庫中一個非常重要的,它位于 頭文件(實際上,更常見的是通過包含 頭文件來間接包含 ,因為 包含了 和 )。 ostream 及其派生
    的頭像 發(fā)表于 09-20 15:11 ?301次閱讀