c++之結構體

寫在前面:學習結構體,應當充分理解它和類的關係,在聲明上,關鍵字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是一個結構體類型,未實例化






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章