寫在前面:學習結構體,應當充分理解它和類的關係,在聲明上,關鍵字struct相當於class,結構體名相當於類名,結構體內部相當於類體,定義的最後都要加分號,只不過結構體可以在定義完成之後可以在括號後面緊跟着就實現,以及類內部默認爲private,而結構體是public,和類一樣,結構體也可以有成員函數(在c中不可以有函數,只可以有函數指針)、構造函數、析構函數、複製構造函數,和類及其相似,只是類的一個前生。
一、結構體的定義:
struct S1//關鍵字加結構體名,與類相似
{
int a;
char b;
flot c;
……
};//分號不能丟
這樣就定義了一個結構體,其形式和類的定義幾乎沒有區別,可以類比記憶。
在定義結構體的同時也能直接初始化結構體:
#include <iostream>
using namespace std;
struct S1//這裏採用在函數外定義,所有函數都可以調用,如果在函數內定義,則只能在函數內調用
{
int a;
} s,ss;
int main()
{
s.a = 1;
ss.a = 2;
cout<<s.a<<" "<<ss.a<<endl;
return 0;
}
#include <iostream>
using namespace std;
struct
{
int a;
} s,ss;
int main()
{
s.a = 1;
ss.a = 2;
cout<<s.a<<" "<<ss.a<<endl;
return 0;
}
另外,c++中結構體聲明是可以沒有結構體名
#include <iostream>
using namespace std;
struct//這裏採用在函數外定義,所有函數都可以調用,如果在函數內定義,則只能在函數內調用
{
int a;
} s,ss;
int main()
{
s.a = 1;
ss.a = 2;
cout<<s.a<<" "<<ss.a<<endl;
return 0;
}
但是這樣就只能在結構體定義的時候實現結構體,由於沒有結構體名,之後並不能在用結構體名來實現結構體。二、利用結構體名實現結構體
S1 s;
struct S1 ss;
在實現結構體的時候,可以省略關鍵詞struct,使其更接近類。
三、結構體成員的訪問
s.a = 1;
s.b = 'a';
同類似類的方法,直接用點操作符,不同於類的是,結構體裏都是公開的,使用起來不用考慮私有的問題(只是因爲其默認爲公開,當然也可以將結構體成員設置爲私有,方法和類相同)
四、結構體成員的初始化
1、通過點操作符初始
2、通過構造函數初始化
3、通過初始化列表初始化
五、結構體做函數參數,做函數返回值
略
六、結構體數組
如果想要同時聲明多個實現結構體,可以選擇結構體數組;
聲明方法:
S1 s[3];
初始化:1、可以選擇聲明後再一個個初始化;
2、也可以選擇在聲明的時候統一初始化:
s1 s[3]=
{
{1,'a',1.1},
{2,'b',2.2},
{3,'c',3.3},
};
附完整測試代碼:
#include <iostream>
#include <string>
using namespace std;
int main() {
struct Example
{
int i_a;//定義一個整型成員
char c_b;//定義一個字符型成員
float f_c;//定義一個浮點型成員
string s_d;//定義一個字符串(已包含頭文件)
void change(){i_a = 1;}//定義一個成員函數
Example(){cout<<"實現了一個Example結構體"<<'\n';}//默認構造函數
Example(int a,char b,float c,string d)
{i_a = a;c_b = b;f_c = c;s_d = d;
cout<<"實現了一個Example結構體"<<'\n';
}//構造函數
~Example(){cout<<"析構了一個Example結構體";}
private://聲明私有變量
int i_aa;
};
Example ex1;//或者寫成 struct Example ex1; struct可以省略,更像對象的定義
Example ex2(1,'a',2.2,"xiaoming");//利用非默認構造函數初始化一個結構體
cout<<ex2.i_a<<'\n'<<ex2.c_b<<'\n'<<ex2.f_c<<'\n'<<ex2.s_d<<endl; //打印結構體變量,測試初始化
cout<<"測試結構體函數"<<endl;
ex2.change();//調用結構體函數
cout<<ex2.i_a<<endl;//測試結構體函數是否成功調用
//ex2.i_aa = 1;//訪問結構體私有成員,程序報錯
}
拓展閱讀:
typedef在結構體中的作用
形式一:
struct Student
{
int a;
};//結構體類型是Student
//聲明變量的時候可以寫
Student s1;//——c++寫法
struct Student s2;//——c語言寫法
形式二:
typedef struct Student
{
int a;
}stu;//stu相當於struct Student的一個別名
//聲明變量時可寫
Stu stu1;
struct stu2;
struct Student stu3;
對於c++,不論用不用typedef,都可以直接Student stu1,struct可以省略,使用typedef後,聲明結構體變量時,類型名和別名有一個即可,均可以用來聲明變量。但是對於c語言加了typedef後就可以用別名,可以避免使用struct;
另外,對於c++,用不用typedef也有區別:
形式一:
struct Student
{
int a;
}stu1;//stu1是一個結構體變量,已實例化
形式二:
typedef struct Student
{
int a;
}stu2;//stu2是一個結構體類型,未實例化