C++| struct結(jié)構(gòu)體
發(fā)布時間:2023-11-27 14:13:38
C++中,結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C++中聚合數(shù)據(jù)類型(aggregate data type)的一類。結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時也是一些元素的集合,這些元素稱為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。本文主要介紹C++中struct結(jié)構(gòu)體。
1、結(jié)構(gòu)體的定義與聲明
結(jié)構(gòu)體的定義如下所示,struct
為結(jié)構(gòu)體關(guān)鍵字,tag
為結(jié)構(gòu)體的標志,member-list
為結(jié)構(gòu)體成員列表,其必須列出其所有成員;variable-list
為此結(jié)構(gòu)體聲明的變量。
struct tag {member-list} variable-list ;
在一般情況下,tag
、member-list
、variable-list
這3部分至少要出現(xiàn)2個。
例如,
//此聲明聲明了擁有3個成員的結(jié)構(gòu)體,分別為整型的a,字符型的b和雙精度的c
//同時又聲明了結(jié)構(gòu)體變量s1
//這個結(jié)構(gòu)體并沒有標明其標簽
struct {
int a;
char b;
double c;
} s1;
//同上聲明了擁有3個成員的結(jié)構(gòu)體,分別為整型的a,字符型的b和雙精度的c
//結(jié)構(gòu)體的標簽被命名為SIMPLE,沒有聲明變量
struct SIMPLE{
int a;
char b;
double c;
};
//用SIMPLE標簽的結(jié)構(gòu)體,另外聲明了變量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef創(chuàng)建新類型
typedef struct{
int a;
char b;
double c;
} Simple2;
//可以用Simple2作為類型聲明新的結(jié)構(gòu)體變量
Simple2 u1, u2[20], *u3;//這樣聲明C語言中也是可以的,因為是typedef定義的
SIMPLE tt;//C++可以這樣定義,C語言中前面需要加struct,不可以省略
注意:如上面示例中,即使他們的成員列表是一樣的,它們也是不同的類型。以上語法與C語言中基本相同,C++中聲明結(jié)構(gòu)體變量時可以省略struct
。
2、嵌套結(jié)構(gòu)體
結(jié)構(gòu)體的成員可以包含其他結(jié)構(gòu)體,也可以包含指向自己結(jié)構(gòu)體類型的指針,而通常這種指針的應(yīng)用是為了實現(xiàn)一些更高級的數(shù)據(jù)結(jié)構(gòu)如鏈表和樹等。
例如,
//此結(jié)構(gòu)體的聲明包含了其他的結(jié)構(gòu)體
struct COMPLEX{
char string[100];
struct SIMPLE a;
};
//此結(jié)構(gòu)體的聲明包含了指向自己類型的指針
struct NODE{
char string[100];
struct NODE *next_node;
};
如果兩個結(jié)構(gòu)體互相包含,則需要對其中一個結(jié)構(gòu)體進行不完整聲明。
例如,
struct B;
//對結(jié)構(gòu)體B進行不完整聲明
//結(jié)構(gòu)體A中包含指向結(jié)構(gòu)體B的指針
struct A{
struct B *partner;
//other members;
};
//結(jié)構(gòu)體B中包含指向結(jié)構(gòu)體A的指針,在A聲明完后,B也隨之進行聲明
struct B{
struct A *partner;
//other members;
};
3、沒有成員變量的結(jié)構(gòu)體
也可以定義一個空的結(jié)構(gòu)體,有時候我們需要某一個結(jié)構(gòu)體數(shù)據(jù)類型,但是暫時又不知道如何填充里面的成員變量,可以有如下定義:
struct Books {
//TODO
} book;
4、訪問結(jié)構(gòu)體成員
訪問一個結(jié)構(gòu)體成員變量,可以使用成員操作符(.) ,
例如,
#include <iostream>
using namespace std;
#include <string.h>
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* print Book1 info */
printf( "Book 1 title : %s\n", Book1.title);
printf( "Book 1 author : %s\n", Book1.author);
printf( "Book 1 subject : %s\n", Book1.subject);
printf( "Book 1 book_id : %d\n", Book1.book_id);
/* print Book2 info */
printf( "Book 2 title : %s\n", Book2.title);
printf( "Book 2 author : %s\n", Book2.author);
printf( "Book 2 subject : %s\n", Book2.subject);
printf( "Book 2 book_id : %d\n", Book2.book_id);
return 0;
}
5、結(jié)構(gòu)體作用
結(jié)構(gòu)體和其他類型基礎(chǔ)數(shù)據(jù)類型一樣,例如,int
類型、char
類型,只不過結(jié)構(gòu)體可以做成你想要的數(shù)據(jù)類型。以方便日后的使用。
在實際項目中,結(jié)構(gòu)體是大量存在的。研發(fā)人員常使用結(jié)構(gòu)體來封裝一些屬性來組成新的類型。研發(fā)人員通常使用結(jié)構(gòu)體創(chuàng)造新的“屬性”,其目的是簡化運算。
結(jié)構(gòu)體在函數(shù)中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關(guān)心這個是什么,只要根據(jù)定義使用就可以了。
6、結(jié)構(gòu)作為函數(shù)參數(shù)