C++ 中類(lèi)(class)和結(jié)構(gòu)體(struct)的區(qū)別
在 C++ 中,類(lèi)(class)和結(jié)構(gòu)體(struct)經(jīng)常被用來(lái)定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu),但兩者之間既有區(qū)別又能很好地結(jié)合使用。本文將深入講解它們的區(qū)別、關(guān)系,并通過(guò)豐富的代碼案例說(shuō)明如何靈活運(yùn)用它們。

1. 類(lèi)與結(jié)構(gòu)體的核心區(qū)別
1.1 語(yǔ)法上的區(qū)別
- 默認(rèn)訪(fǎng)問(wèn)權(quán)限:
- 結(jié)構(gòu)體(struct): 默認(rèn)訪(fǎng)問(wèn)權(quán)限是 public。
- 類(lèi)(class): 默認(rèn)訪(fǎng)問(wèn)權(quán)限是 private。
- 這是兩者在語(yǔ)法上的唯一區(qū)別,但在功能上它們可以互相替代。
1.2 使用場(chǎng)景的區(qū)別
- 結(jié)構(gòu)體:更適合存儲(chǔ)簡(jiǎn)單的數(shù)據(jù),沒(méi)有復(fù)雜行為邏輯。
- 類(lèi):不僅可以存儲(chǔ)數(shù)據(jù),還可以定義操作行為,并支持面向?qū)ο筇匦?,如封裝、繼承、多態(tài)等。
1.3 概念上的區(qū)別
- 結(jié)構(gòu)體: 偏向于“數(shù)據(jù)的集合”,是一種輕量級(jí)的數(shù)據(jù)封裝工具。
- 類(lèi): 偏向于“數(shù)據(jù)與行為的結(jié)合體”,是面向?qū)ο缶幊蹋∣OP)的核心。
2. 為什么要從結(jié)構(gòu)體擴(kuò)展到類(lèi)?
在 C 中,結(jié)構(gòu)體只能存儲(chǔ)數(shù)據(jù),無(wú)法定義與數(shù)據(jù)相關(guān)的操作。這種方式雖然簡(jiǎn)單,但對(duì)于復(fù)雜的系統(tǒng),數(shù)據(jù)和操作的分離使得代碼難以維護(hù)。
C++ 引入了類(lèi)(class),在繼承結(jié)構(gòu)體優(yōu)點(diǎn)的基礎(chǔ)上,增加了以下功能:
- 支持將“數(shù)據(jù)”和“操作”封裝在一起。
- 提供訪(fǎng)問(wèn)控制(public、private、protected)。
- 支持繼承和多態(tài),實(shí)現(xiàn)代碼復(fù)用和擴(kuò)展。
3. 類(lèi)和結(jié)構(gòu)體的關(guān)系
在 C++ 中,類(lèi)和結(jié)構(gòu)體可以看作是同源不同職:
- 同源: 類(lèi)和結(jié)構(gòu)體在語(yǔ)法和功能上幾乎完全一致,都可以包含數(shù)據(jù)成員和成員函數(shù)。
- 不同職: 結(jié)構(gòu)體主要用于簡(jiǎn)單數(shù)據(jù)封裝,類(lèi)則更偏向于復(fù)雜邏輯實(shí)現(xiàn)。
如何搭配使用?
- 結(jié)構(gòu)體負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。
- 類(lèi)負(fù)責(zé)封裝行為和操作邏輯。
- 兩者結(jié)合可以實(shí)現(xiàn)高效的代碼組織方式。
4. 代碼案例:類(lèi)與結(jié)構(gòu)體的結(jié)合使用
4.1 一個(gè)簡(jiǎn)單的案例:矩形面積計(jì)算
我們通過(guò)一個(gè)例子來(lái)說(shuō)明如何將結(jié)構(gòu)體和類(lèi)結(jié)合使用。
#include <iostream>
using namespace std;
// 定義一個(gè)結(jié)構(gòu)體,用來(lái)存儲(chǔ)矩形的寬和高
struct Dimensions {
double width;
double height;
};
// 定義一個(gè)類(lèi),用來(lái)操作矩形
class Rectangle {
private:
Dimensions dims; // 使用結(jié)構(gòu)體存儲(chǔ)矩形的基本信息
public:
// 構(gòu)造函數(shù),初始化矩形
Rectangle(double width, double height) {
dims.width = width;
dims.height = height;
}
// 設(shè)置矩形的寬度和高度
void setDimensions(double width, double height) {
dims.width = width;
dims.height = height;
}
// 計(jì)算矩形的面積
double calculateArea() const {
return dims.width * dims.height;
}
// 顯示矩形的信息
void display() const {
cout << "Width: " << dims.width
<< ", Height: " << dims.height
<< ", Area: " << calculateArea()
<< endl;
}
};
int main() {
// 創(chuàng)建一個(gè)矩形對(duì)象
Rectangle rect(5.0, 10.0);
// 顯示矩形信息
rect.display();
// 修改矩形的尺寸
rect.setDimensions(8.0, 12.0);
// 再次顯示矩形信息
rect.display();
return 0;
}
輸出結(jié)果:
Width: 5, Height: 10, Area: 50
Width: 8, Height: 12, Area: 96
分析:
- 結(jié)構(gòu)體
Dimensions: 負(fù)責(zé)存儲(chǔ)矩形的寬度和高度。 - 類(lèi)
Rectangle: 負(fù)責(zé)操作矩形,比如設(shè)置尺寸和計(jì)算面積。
4.2 擴(kuò)展案例:支持圓形和矩形的面積計(jì)算
進(jìn)一步擴(kuò)展,假設(shè)我們需要支持矩形和圓形的面積計(jì)算,可以通過(guò)繼承和多態(tài)來(lái)實(shí)現(xiàn)。
#include <iostream>
#include <cmath>
using namespace std;
// 定義一個(gè)結(jié)構(gòu)體,用來(lái)存儲(chǔ)形狀的基本屬性
struct ShapeDimensions {
double width; // 對(duì)于矩形表示寬度
double height; // 對(duì)于矩形表示高度
double radius; // 對(duì)于圓形表示半徑
};
// 定義一個(gè)基類(lèi),表示通用形狀
class Shape {
protected:
ShapeDimensions dims;
public:
virtual double calculateArea() const = 0; // 純虛函數(shù),子類(lèi)必須實(shí)現(xiàn)
virtual void display() const = 0; // 純虛函數(shù),用于顯示信息
};
// 定義矩形類(lèi),繼承 Shape
class Rectangle : public Shape {
public:
Rectangle(double width, double height) {
dims.width = width;
dims.height = height;
}
double calculateArea() const override {
return dims.width * dims.height;
}
void display() const override {
cout << "Rectangle: Width = " << dims.width
<< ", Height = " << dims.height
<< ", Area = " << calculateArea()
<< endl;
}
};
// 定義圓形類(lèi),繼承 Shape
class Circle : public Shape {
public:
Circle(double radius) {
dims.radius = radius;
}
double calculateArea() const override {
return M_PI * dims.radius * dims.radius;
}
void display() const override {
cout << "Circle: Radius = " << dims.radius
<< ", Area = " << calculateArea()
<< endl;
}
};
int main() {
// 創(chuàng)建矩形和圓形對(duì)象
Rectangle rect(5.0, 10.0);
Circle circle(7.0);
// 顯示它們的面積
rect.display();
circle.display();
return 0;
}
輸出結(jié)果:
Rectangle: Width = 5, Height = 10, Area = 50
Circle: Radius = 7, Area = 153.938
分析:
- 結(jié)構(gòu)體
ShapeDimensions: 存儲(chǔ)矩形的寬高和圓形的半徑。 - 基類(lèi)
Shape: 定義通用接口(如calculateArea和display)。 - 派生類(lèi)
Rectangle和Circle: 實(shí)現(xiàn)特定形狀的邏輯。
5. 類(lèi)與結(jié)構(gòu)體結(jié)合使用的總結(jié)
5.1 類(lèi)和結(jié)構(gòu)體的分工:
- 結(jié)構(gòu)體(struct):用于存儲(chǔ)數(shù)據(jù),結(jié)構(gòu)簡(jiǎn)單,效率高。適合作為類(lèi)的內(nèi)部成員,用于表示數(shù)據(jù)。
- 類(lèi)(class):用于封裝邏輯,提供操作和行為接口。適合作為更高級(jí)的抽象工具。
5.2 使用建議:
- 如果只是需要存儲(chǔ)數(shù)據(jù)而沒(méi)有邏輯,用結(jié)構(gòu)體。
- 如果需要對(duì)數(shù)據(jù)進(jìn)行操作或擴(kuò)展功能,用類(lèi)。
- 在復(fù)雜系統(tǒng)中,結(jié)構(gòu)體和類(lèi)結(jié)合使用可以提高代碼的清晰度和可維護(hù)性。
5.3 結(jié)構(gòu)體和類(lèi)的關(guān)系:
它們可以看作是工具箱中的不同工具:
- 結(jié)構(gòu)體是“材料”,用于存放原始數(shù)據(jù)。
- 類(lèi)是“機(jī)器”,用于處理這些數(shù)據(jù)。
通過(guò)類(lèi)與結(jié)構(gòu)體的結(jié)合,我們可以在代碼中清晰地分離數(shù)據(jù)和邏輯,既保持程序的簡(jiǎn)潔性,又能靈活擴(kuò)展功能。
到此這篇關(guān)于C++ 中類(lèi)(class)和結(jié)構(gòu)體(struct)的區(qū)別的文章就介紹到這了,更多相關(guān)C++ 類(lèi)和結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中結(jié)構(gòu)體的類(lèi)型定義和初始化以及變量引用
- C++動(dòng)態(tài)分配和撤銷(xiāo)內(nèi)存以及結(jié)構(gòu)體類(lèi)型作為函數(shù)參數(shù)
- C++中聲明類(lèi)的class與聲明結(jié)構(gòu)體的struct關(guān)鍵字詳解
- C++結(jié)構(gòu)體struct和類(lèi)class區(qū)別詳解
- C++結(jié)構(gòu)體與類(lèi)指針知識(shí)點(diǎn)總結(jié)
- C++關(guān)于類(lèi)結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測(cè)試詳解
- C++類(lèi)結(jié)構(gòu)體與json相互轉(zhuǎn)換
- C++結(jié)構(gòu)體與類(lèi)的區(qū)別詳情
- C++?中的?JSON?序列化和反序列化及結(jié)構(gòu)體與枚舉類(lèi)型的處理方法
相關(guān)文章
基于QT編寫(xiě)一個(gè)網(wǎng)絡(luò)調(diào)試助手
這篇文章主要為大家詳細(xì)介紹了如何基于QT編寫(xiě)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)調(diào)試助手,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起休閑游戲2025-07-07
如何在C語(yǔ)言的宏中使用類(lèi)型關(guān)鍵字
如何在C語(yǔ)言的宏中使用類(lèi)型關(guān)鍵字呢?以下是實(shí)現(xiàn)方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
使用C++實(shí)現(xiàn)Range序列生成器的示例代碼
在C++編程中,經(jīng)常需要迭代一系列數(shù)字或其他可迭代對(duì)象,本文將使用C++來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Range封裝,文中的示例代碼講解詳細(xì),感興趣的可以了解下2023-11-11
C++?Queue隊(duì)列類(lèi)模版實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹C++?Queue隊(duì)列類(lèi)模版實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
Qt實(shí)現(xiàn)小功能之復(fù)雜抽屜效果詳解
在Qt自帶的控件中,也存在抽屜控件:QToolBar。但是,該控件有個(gè)缺點(diǎn):一次只能展開(kāi)一個(gè)抽屜信息,無(wú)法實(shí)現(xiàn)多個(gè)展開(kāi)。所以本文將自定義實(shí)現(xiàn)復(fù)雜抽屜效果,需要的可以參考一下2022-10-10
基于list循環(huán)刪除元素,迭代器失效的問(wèn)題詳解
下面小編就為大家?guī)?lái)一篇基于list循環(huán)刪除元素,迭代器失效的問(wèn)題詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
VScode+ESP32簡(jiǎn)單環(huán)境搭建
本文章向大家介紹ESP32-C3搭建環(huán)境教程,主要包括ESP32-C3搭建環(huán)境教程使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
C++學(xué)習(xí)之移動(dòng)語(yǔ)義與智能指針詳解
智能指針和移動(dòng)語(yǔ)義是迄今為止,最難理解的兩個(gè)概念,下面這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)之移動(dòng)語(yǔ)義與智能指針的相關(guān)資料,需要的朋友可以參考下2021-05-05
C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

