C與C++中struct使用的區別

鴨脖發表於2012-11-28

今天參看了louden用c編寫的編譯器,發現其中一些地方使用struct很奇妙。所以又研究了一下struct的區別,並發現c和c++在某些地方是有區別的。


struct作為類的一種特例,是用來自定義資料結構的,在程式設計的過程中是很有用的。C和C++的主要區別是:一個結構標記宣告後,C語言必須在結構標記前加上struct才能作為結構型別名,而C++語言中,結構標記可以直接作為結構型別名使用。此外,結構在C++中被作為類的一種特例,並且在結構中,資料成員和成員函式預設的訪問許可權是共有的,兒類的則是私有的。


首先我們先在C中使用struct:

按照上面的敘述,我很自然的如下書寫:

struct Student{
int a;
int b;
};


int main(){
struct Student st;
st.a = 90;
st.b = 80;

printf("%d",st.a);
}

如果我把struct去掉的話那麼編譯器就會報錯(編譯器使用的是vc 6.0),說Student是未宣告的識別符號。但是在c++中就不用擔心這一點。如下:

#include<iostream>
using namespace std;


struct Student{
int a;
int b;
};


int main(){
Student st;
st.a = 90;
st.b = 80;
cout<<st.a<<endl;
Student tems = st;
cout<<tems.a<<endl;
return 0;
}


編譯器不會報錯。從上述的程式中我們還可以看到,struct在C和C++中可以實現各個變數之間的賦值,也就是說不用過載賦值操作符。


那麼在C中我可不可以把struct給去掉呢?當然可以,你可以這麼做:


typedef struct student{
int a;
int b;
} Student;


int main(){
Student st;
st.a = 90;
st.b = 80;

printf("%d",st.a);
}


使用typedef即可實現上述要求。


++++++++++++++++++++++++++++++++++++++++++++++++++++++

在C和C++中struct和union是非常相似的,只不過union共享儲存區而已,共享的是資料變數所佔空間最大的儲存區。其他和struct一樣,都如上所述:

union Student{
int a;
int b;
};


int main(){
union Student st;
st.a = 90;
st.b = 80;

printf("%d",st.a);
}

輸出結果是80

C++:

#include<iostream>
using namespace std;


union Student{
int a;
int b;
};


int main(){
Student st;
st.a = 90;
st.b = 80;
cout<<st.a<<endl;
Student tems = st;
cout<<tems.a<<endl;
return 0;
}

輸出結果是80 80,從中可以看出它也過載了=操作符。







相關文章