背景
當我們在編寫程序時,經常需要定義一些數據類型,這些數據類型可以封裝數據和函數,以便我們更好地組織和管理代碼。C++中的類就是一種用于定義新的數據類型的機制,它允許我們將數據和函數封裝在一起,形成一個獨立的模塊,這個模塊可以被其他代碼重復使用。
類的定義和聲明
類是一種用戶自定義的數據類型,它可以包含數據成員和成員函數。數據成員是類的屬性,成員函數是類的行為。類定義了一種新的數據類型,我們可以使用這種數據類型來創建對象,每個對象都有自己的數據成員和成員函數,在C++中,我們使用class關鍵字來定義一個類。類的定義包括類名、數據成員和成員函數。下面是一個簡單的類定義的例子:
class Person {
public:
// 成員函數
void sayHello() {
std::cout << "Hello, world!" << std::endl;
}
private:
// 數據成員
std::string name;
int age;
};
在這個例子中,我們定義了一個名為Person的類,它有一個公有成員函數sayHello和兩個私有數據成員name和age。公有成員函數可以被任何代碼訪問,而私有數據成員只能被類的成員函數訪問。
構造函數
在C++中,構造函數是一種特殊的成員函數,用于初始化對象的數據成員。構造函數的名稱與類的名稱相同,沒有返回類型,可以有參數。當創建一個對象時,構造函數會自動調用,以初始化對象的數據成員。
class MyClass {
public:
int publicVar;
MyClass(int var) {
publicVar = var;
}
};
在上面的示例中,MyClass類有一個帶有一個整數參數的構造函數,用于初始化publicVar數據成員。當創建一個MyClass對象時,可以傳遞一個整數參數來調用構造函數,以初始化publicVar數據成員。
?需要注意的是,如果一個類沒有定義構造函數,則編譯器會自動生成一個默認構造函數。默認構造函數沒有參數,不執行任何操作,只是將對象的數據成員初始化為默認值。
?
如果一個類有多個構造函數,則可以使用函數重載來實現。函數重載是指在同一個作用域內定義多個函數,它們具有相同的名稱但不同的參數列表。當調用一個重載函數時,編譯器會根據傳遞的參數類型和數量來確定要調用哪個函數。
class MyClass {
public:
int publicVar;
MyClass() {
publicVar = 0;
}
MyClass(int var) {
publicVar = var;
}
};
在上面的示例中,MyClass類有兩個構造函數,一個是默認構造函數,另一個是帶有一個整數參數的構造函數。當創建一個MyClass對象時,可以選擇調用哪個構造函數來初始化publicVar數據成員。
析構函數
C++中的析構函數(Destructor)是一種特殊的成員函數,它在對象被銷毀時自動調用。它的作用是釋放對象占用的資源,比如堆上的內存、文件句柄、數據庫連接等等。
C++中的析構函數使用一個波浪線(~)作為前綴,后跟類的名稱。它不接受任何參數,也沒有返回值,因為它的主要作用是在對象被銷毀時自動執行。析構函數的名稱與類名稱相同,但前面有一個波浪線符號。
例如,下面是一個簡單的類和它的析構函數的示例:
class MyClass {
public:
// 構造函數
MyClass() {
// 構造函數代碼
}
// 析構函數
~MyClass() {
// 析構函數代碼
}
};
當程序中創建一個MyClass對象時,構造函數將被自動調用以初始化對象。當對象的生命周期結束時,析構函數將自動調用以清理對象所占用的資源。
?需要注意的是,當一個對象被銷毀時,它的析構函數會自動遞歸調用所有成員變量的析構函數,直到所有占用的資源都被釋放為止。如果一個類中有指向堆上分配的內存的指針,需要在析構函數中手動釋放這些內存,以避免內存泄漏。
?
實例化
在C++中,要實例化一個類,你需要創建該類的對象。這可以通過聲明一個類類型的變量,然后使用new關鍵字調用構造函數來完成。例如,如果你有一個名為MyClass的類,你可以按如下方式創建該類的對象:
MyClass* obj = new MyClass();
這將創建一個MyClass類的新對象,并返回指向該對象的指針。然后,你可以使用->運算符訪問對象的公共成員。例如,如果MyClass有一個名為publicVar的公共成員,你可以按如下方式訪問它:
obj->publicVar = 42;
另外,你也可以不使用new關鍵字創建該類的對象。例如:
MyClass obj;
這將在堆棧上創建一個MyClass類的新對象。然后,你可以使用.運算符訪問對象的公共成員。例如:
obj.publicVar = 42;
訪問控制
訪問控制是C++中類的一個重要概念,用于控制成員的訪問權限。C++中的類可以使用public、private和protected關鍵字來控制成員的訪問權限。其中,public成員可以被任何人訪問,private成員只能被類的成員函數訪問,protected成員可以被類的成員函數和派生類的成員函數訪問。
友元函數
在C++中,友元函數是一種特殊的函數,它可以訪問一個類的私有成員和保護成員。友元函數并不是類的成員函數,因此它不能使用成員訪問運算符.或->來訪問類的成員。相反,它必須使用傳遞給它的類對象的引用來訪問類的成員。
友元函數的聲明需要在類的定義中進行,使用friend關鍵字。例如:
class MyClass {
private:
int privateVar;
friend void friendFunc(MyClass& obj); // 聲明友元函數
};
在這個例子中,friendFunc是一個友元函數,可以訪問MyClass的私有成員privateVar。注意,友元函數并不是MyClass的成員函數,因此它不能使用成員訪問運算符.或->來訪問MyClass的成員。相反,它必須使用傳遞給它的MyClass對象的引用來訪問MyClass的成員。例如:
void friendFunc(MyClass& obj) {
obj.privateVar = 42; // 可以訪問私有成員
}
在這個例子中,friendFunc可以訪問MyClass的私有成員privateVar,因為它被聲明為MyClass的友元函數。注意,friendFunc使用傳遞給它的MyClass對象的引用來訪問MyClass的成員。
友元函數可以是全局函數,也可以是其他類的成員函數。如果友元函數是其他類的成員函數,那么這個類必須先被定義。例如,在以下代碼中,例如:
class MyClass {
private:
int privateVar;
friend void friendFunc(MyClass& obj); // 聲明全局友元函數
friend class FriendClass; // 聲明其他類的友元類
};
void friendFunc(MyClass& obj) {
obj.privateVar = 1; // 可以訪問MyClass的私有成員
}
class FriendClass {
public:
void friendFunc(MyClass& obj) {
obj.privateVar = 2; // 可以訪問MyClass的私有成員
}
};
FriendClass的成員函數friendFunc被聲明為MyClass的友元函數,因此它可以訪問MyClass的私有成員privateVar。注意,這里的聲明需要在FriendClass的定義之后進行。此外,需要注意的是,友元函數的聲明只是告訴編譯器這個函數是一個友元函數,它并不會影響函數的調用方式。因此,在調用友元函數時,仍然需要使用傳遞給它的類對象的引用來訪問類的成員。例如,在以下代碼中:
class MyClass {
private:
int privateVar;
friend void friendFunc(MyClass& obj); // 聲明全局友元函數
};
void friendFunc(MyClass& obj) {
obj.privateVar = 1; // 可以訪問MyClass的私有成員
}
int main() {
MyClass obj;
friendFunc(obj); // 調用友元函數
return 0;
}
雖然friendFunc是一個全局友元函數,可以訪問MyClass的私有成員privateVar,但在調用friendFunc時仍然需要使用傳遞給它的MyClass對象的引用來訪問MyClass的成員。
-
函數
+關注
關注
3文章
4307瀏覽量
62433 -
C++
+關注
關注
22文章
2104瀏覽量
73498 -
數據類型
+關注
關注
0文章
236瀏覽量
13609
發布評論請先 登錄
相關推薦
評論