C++中的結(jié)構(gòu)體使用及說明
C++中很特殊的一類自定義數(shù)據(jù)-結(jié)構(gòu)體
為什么說C++中的結(jié)構(gòu)體特殊,因?yàn)樗床煌贑中的結(jié)構(gòu)體,基本和C++中的Class也是不同的
一、C++ 結(jié)構(gòu)體(struct)簡介
在 C++ 中,struct 是一種用戶自定義的數(shù)據(jù)類型,它不僅可以包含數(shù)據(jù)成員(變量),還可以包含成員函數(shù)(方法),支持繼承、多態(tài)等面向?qū)ο筇匦?/strong>。(重點(diǎn),需要記住)。
C++ 的 struct 是 C 語言 struct 的超集,同時也是一種特殊的類(class)。(這句話就很好的總結(jié)了C++中struct和c中struct的關(guān)系和C++中的Class的關(guān)系)
二、C 語言中的結(jié)構(gòu)體
在 C 語言 中,struct 僅用于聚合數(shù)據(jù),不能包含成員函數(shù),也不支持訪問控制和繼承。
示例(C 語言)
運(yùn)行
#include <stdio.h>
struct Point {
int x;
int y;
};
int main() {
struct Point p1 = {10, 20};
printf("x = %d, y = %d\n", p1.x, p1.y);
return 0;
}特點(diǎn):
- 只能包含數(shù)據(jù)成員
- 所有成員默認(rèn)為 public
- 不能有成員函數(shù)
- 不支持繼承、多態(tài)
- 聲明變量時必須帶
struct關(guān)鍵字(除非用typedef)
三、C++ 中的結(jié)構(gòu)體
C++ 保留了 C 語言 struct 的所有功能,同時增加了面向?qū)ο筇匦浴?/p>
示例(C++ 結(jié)構(gòu)體)
運(yùn)行
#include <iostream>
using namespace std;
struct Point {
int x;
int y;
// 成員函數(shù)
void print() {
cout << "x = " << x << ", y = " << y << endl;
}
// 構(gòu)造函數(shù)
Point(int a, int b) : x(a), y(b) {}
};
int main() {
Point p1(10, 20); // 直接創(chuàng)建對象
p1.print();
return 0;
}特點(diǎn):
- 可以包含成員函數(shù)(方法)
- 支持構(gòu)造函數(shù)和析構(gòu)函數(shù)
- 支持訪問控制(public / private / protected)
- 支持繼承
- 支持多態(tài)(虛函數(shù))
- 默認(rèn)訪問權(quán)限為 public(與 class 不同)
- 默認(rèn)繼承方式為 public(與 class 不同)
四、C++ struct 與 C struct 的區(qū)別
| 特性 | C 語言 struct | C++ struct |
|---|---|---|
| 成員類型 | 只能是數(shù)據(jù)成員 | 可以是數(shù)據(jù)成員 + 成員函數(shù) |
| 訪問控制 | 無(默認(rèn)為 public) | 支持 public /private/protected |
| 構(gòu)造函數(shù) | 不支持 | 支持 |
| 繼承 | 不支持 | 支持 |
| 多態(tài)(虛函數(shù)) | 不支持 | 支持 |
| 使用 struct 關(guān)鍵字 | 聲明變量必須帶 struct | 可直接用結(jié)構(gòu)體名作為類型名 |
| 初始化 | 僅支持聚合初始化 | 支持聚合初始化 + 構(gòu)造函數(shù)初始化 |
五、C++ struct 與 class 的區(qū)別
在 C++ 中,struct 和 class 幾乎完全相同,唯一的區(qū)別在于默認(rèn)訪問權(quán)限和默認(rèn)繼承方式。
| 對比項(xiàng) | struct | class |
|---|---|---|
| 默認(rèn)成員訪問權(quán)限 | public | private |
| 默認(rèn)繼承方式 | public | private |
| 其他特性 | 完全一致(構(gòu)造函數(shù)、析構(gòu)函數(shù)、虛函數(shù)、模板等) | 完全一致 |
示例(默認(rèn)訪問權(quán)限差異)
運(yùn)行
struct S {
int a; // 默認(rèn) public
};
class C {
int a; // 默認(rèn) private
};
int main() {
S s;
s.a = 10; // OK,public 成員
C c;
// c.a = 10; // 錯誤!a 是 private 成員
}示例(默認(rèn)繼承方式差異)
運(yùn)行
struct Base {
int x;
};
struct Derived1 : Base { }; // 默認(rèn) public 繼承
class Derived2 : Base { }; // 默認(rèn) private 繼承
int main() {
Derived1 d1;
d1.x = 10; // OK,public 繼承
Derived2 d2;
// d2.x = 10; // 錯誤!Base::x 在 Derived2 中是 private
}六、使用建議
C++ struct 通常用于:
- 僅包含數(shù)據(jù),沒有或只有少量簡單方法(類似 C 結(jié)構(gòu)體的用途)
- 與 C 語言兼容的接口定義
C++ class 通常用于:
- 需要封裝、繼承、多態(tài)的復(fù)雜類型
- 強(qiáng)調(diào)數(shù)據(jù)隱藏和接口暴露的面向?qū)ο笤O(shè)計(jì)
總結(jié)
C++ struct 是 C struct 的超集,增加了成員函數(shù)、訪問控制、繼承、多態(tài)等面向?qū)ο筇匦浴?/p>
與 C++ class 的唯一區(qū)別在于默認(rèn)訪問權(quán)限和默認(rèn)繼承方式:
struct:默認(rèn) public 成員 & public 繼承class:默認(rèn) private 成員 & private 繼承
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++控制臺循環(huán)鏈表實(shí)現(xiàn)貪吃蛇
這篇文章主要為大家詳細(xì)介紹了C++控制臺循環(huán)鏈表實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
C語言接口與實(shí)現(xiàn)方法實(shí)例詳解
這篇文章主要介紹了C語言接口與實(shí)現(xiàn)方法,包括接口的概念、實(shí)現(xiàn)方法及抽象數(shù)據(jù)類型等,并配合實(shí)例予以說明,需要的朋友可以參考下2014-09-09
c語言循環(huán)加數(shù)組實(shí)現(xiàn)漢諾塔問題
本文主要介紹了c語言循環(huán)加數(shù)組實(shí)現(xiàn)漢諾塔問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
在Qt中使用QString進(jìn)行字符串截取的多種方法
本文詳細(xì)介紹了在Qt中使用QString進(jìn)行字符串截取的多種方法:left()和right()分別用于截取字符串的左右指定長度子串;mid()支持從任意位置截取;section()通過分隔符提取特定區(qū)段;chopped()可快速移除末尾字符,文章通過代碼示例展示了各方法的用法2026-01-01
VC中LINK 2001 和 LINK 2009 的錯誤的解決方法
最近將兩個開源C++項(xiàng)目編譯成windows版本的時候遇到很多問題,編譯的時候總是報(bào)錯,報(bào)的最多的是無法解析的外部符號”,經(jīng)過近3天的折騰總算都通過了,這里是一些總結(jié)2020-10-10
將正小數(shù)轉(zhuǎn)化為2-9進(jìn)制小數(shù)的實(shí)現(xiàn)方法
本篇文章對正小數(shù)轉(zhuǎn)化為2-9進(jìn)制小數(shù)的實(shí)現(xiàn)方法進(jìn)行了介紹,需要的朋友參考下2013-05-05

