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

1. 類與結構體的核心區(qū)別
1.1 語法上的區(qū)別
- 默認訪問權限:
- 結構體(struct): 默認訪問權限是 public。
- 類(class): 默認訪問權限是 private。
- 這是兩者在語法上的唯一區(qū)別,但在功能上它們可以互相替代。
1.2 使用場景的區(qū)別
- 結構體:更適合存儲簡單的數(shù)據(jù),沒有復雜行為邏輯。
- 類:不僅可以存儲數(shù)據(jù),還可以定義操作行為,并支持面向對象特性,如封裝、繼承、多態(tài)等。
1.3 概念上的區(qū)別
- 結構體: 偏向于“數(shù)據(jù)的集合”,是一種輕量級的數(shù)據(jù)封裝工具。
- 類: 偏向于“數(shù)據(jù)與行為的結合體”,是面向對象編程(OOP)的核心。
2. 為什么要從結構體擴展到類?
在 C 中,結構體只能存儲數(shù)據(jù),無法定義與數(shù)據(jù)相關的操作。這種方式雖然簡單,但對于復雜的系統(tǒng),數(shù)據(jù)和操作的分離使得代碼難以維護。
C++ 引入了類(class),在繼承結構體優(yōu)點的基礎上,增加了以下功能:
- 支持將“數(shù)據(jù)”和“操作”封裝在一起。
- 提供訪問控制(public、private、protected)。
- 支持繼承和多態(tài),實現(xiàn)代碼復用和擴展。
3. 類和結構體的關系
在 C++ 中,類和結構體可以看作是同源不同職:
- 同源: 類和結構體在語法和功能上幾乎完全一致,都可以包含數(shù)據(jù)成員和成員函數(shù)。
- 不同職: 結構體主要用于簡單數(shù)據(jù)封裝,類則更偏向于復雜邏輯實現(xiàn)。
如何搭配使用?
- 結構體負責存儲數(shù)據(jù)。
- 類負責封裝行為和操作邏輯。
- 兩者結合可以實現(xiàn)高效的代碼組織方式。
4. 代碼案例:類與結構體的結合使用
4.1 一個簡單的案例:矩形面積計算
我們通過一個例子來說明如何將結構體和類結合使用。
#include <iostream>
using namespace std;
// 定義一個結構體,用來存儲矩形的寬和高
struct Dimensions {
double width;
double height;
};
// 定義一個類,用來操作矩形
class Rectangle {
private:
Dimensions dims; // 使用結構體存儲矩形的基本信息
public:
// 構造函數(shù),初始化矩形
Rectangle(double width, double height) {
dims.width = width;
dims.height = height;
}
// 設置矩形的寬度和高度
void setDimensions(double width, double height) {
dims.width = width;
dims.height = height;
}
// 計算矩形的面積
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)建一個矩形對象
Rectangle rect(5.0, 10.0);
// 顯示矩形信息
rect.display();
// 修改矩形的尺寸
rect.setDimensions(8.0, 12.0);
// 再次顯示矩形信息
rect.display();
return 0;
}
輸出結果:
Width: 5, Height: 10, Area: 50
Width: 8, Height: 12, Area: 96
分析:
- 結構體
Dimensions: 負責存儲矩形的寬度和高度。 - 類
Rectangle: 負責操作矩形,比如設置尺寸和計算面積。
4.2 擴展案例:支持圓形和矩形的面積計算
進一步擴展,假設我們需要支持矩形和圓形的面積計算,可以通過繼承和多態(tài)來實現(xiàn)。
#include <iostream>
#include <cmath>
using namespace std;
// 定義一個結構體,用來存儲形狀的基本屬性
struct ShapeDimensions {
double width; // 對于矩形表示寬度
double height; // 對于矩形表示高度
double radius; // 對于圓形表示半徑
};
// 定義一個基類,表示通用形狀
class Shape {
protected:
ShapeDimensions dims;
public:
virtual double calculateArea() const = 0; // 純虛函數(shù),子類必須實現(xiàn)
virtual void display() const = 0; // 純虛函數(shù),用于顯示信息
};
// 定義矩形類,繼承 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;
}
};
// 定義圓形類,繼承 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)建矩形和圓形對象
Rectangle rect(5.0, 10.0);
Circle circle(7.0);
// 顯示它們的面積
rect.display();
circle.display();
return 0;
}
輸出結果:
Rectangle: Width = 5, Height = 10, Area = 50
Circle: Radius = 7, Area = 153.938
分析:
- 結構體
ShapeDimensions: 存儲矩形的寬高和圓形的半徑。 - 基類
Shape: 定義通用接口(如calculateArea和display)。 - 派生類
Rectangle和Circle: 實現(xiàn)特定形狀的邏輯。
5. 類與結構體結合使用的總結
5.1 類和結構體的分工:
- 結構體(struct):用于存儲數(shù)據(jù),結構簡單,效率高。適合作為類的內部成員,用于表示數(shù)據(jù)。
- 類(class):用于封裝邏輯,提供操作和行為接口。適合作為更高級的抽象工具。
5.2 使用建議:
- 如果只是需要存儲數(shù)據(jù)而沒有邏輯,用結構體。
- 如果需要對數(shù)據(jù)進行操作或擴展功能,用類。
- 在復雜系統(tǒng)中,結構體和類結合使用可以提高代碼的清晰度和可維護性。
5.3 結構體和類的關系:
它們可以看作是工具箱中的不同工具:
- 結構體是“材料”,用于存放原始數(shù)據(jù)。
- 類是“機器”,用于處理這些數(shù)據(jù)。
通過類與結構體的結合,我們可以在代碼中清晰地分離數(shù)據(jù)和邏輯,既保持程序的簡潔性,又能靈活擴展功能。
到此這篇關于C++ 中類(class)和結構體(struct)的區(qū)別的文章就介紹到這了,更多相關C++ 類和結構體內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

