背景
當(dāng)我們在編寫程序時,經(jīng)常需要定義一些數(shù)據(jù)類型,這些數(shù)據(jù)類型可以封裝數(shù)據(jù)和函數(shù),以便我們更好地組織和管理代碼。C++中的類就是一種用于定義新的數(shù)據(jù)類型的機制,它允許我們將數(shù)據(jù)和函數(shù)封裝在一起,形成一個獨立的模塊,這個模塊可以被其他代碼重復(fù)使用。
類的定義和聲明
類是一種用戶自定義的數(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ù)。當(dāng)創(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ù)成員。當(dāng)創(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ù)列表。當(dāng)調(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ù)。當(dāng)創(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ù)代碼
}
};
當(dāng)程序中創(chuàng)建一個MyClass對象時,構(gòu)造函數(shù)將被自動調(diào)用以初始化對象。當(dāng)對象的生命周期結(jié)束時,析構(gòu)函數(shù)將自動調(diào)用以清理對象所占用的資源。
?需要注意的是,當(dāng)一個對象被銷毀時,它的析構(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的成員。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4338瀏覽量
62735 -
C++
+關(guān)注
關(guān)注
22文章
2111瀏覽量
73703 -
數(shù)據(jù)類型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13637
發(fā)布評論請先 登錄
相關(guān)推薦
評論