您好,登錄后才能下訂單哦!
小編給大家分享一下C++ 結構體struct與共用體union是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
編碼運行環境:VS2017+Win32+Debug,Win32表示生成32bits的應用程序。
結構體(struct)與共用體(union)是C語言中就已經存在的數據類型,C++對他們進行了擴充,最大的變化是允許在結構和公用體中定義成員函數。下面將通過實例講解二者的特性和用法。
1.struct
以下是一個使用了結構體的C++程序。
#include <iostream> using namespace std; struct Room { int floor; int No; }; struct Student { int age; int score; Student(int a,int s){ age=a; score=s; } }; int main(int argc,char* argv[]) { Room r[3]={{1,101},{2,201},{3,301}}; Student s(18,89); cout<<"the room are:"; cout<<r[0].floor<<"-"<<r[0].No<<" "; cout<<r[1].floor<<"-"<<r[1].No<<" "; cout<<r[2].floor<<"-"<<r[2].No<<endl; cout<<"the student's age:"<<s.age<<" score:"<<s.score<<endl; getchar(); }
程序運行結果:
the room are:1-101 2-201 3-301
the student's age:18 score:89
閱讀以上程序,在C++中使用結構體需要注意以下幾點:
(1)C++中,結構體是一種真正的數據類型,在利用結構定義變量時,不需要像在C中帶上struct關鍵字,或先使用typedef struct structname structalias的方式進行申明。
(2)C++對C中的struct進行了擴充,允許在struct中定義成員函數。struct中的成員變量和成員函數也有訪問權限,在class中,默認的訪問權限是private,而在struct中默認訪問權限是public,這是結構體和類的唯一區別。struct成員的默認訪問權限設為public是C++保持與C語言兼容而采取的一項策略。
(3)如果struct中沒有顯示定義任何構造函數,那么結構變量可以像在C語言中那樣用花括號順序指明數據成員的值來進行初始化。但是一旦顯示定義了任何一個構造函數,就不能用這種方式初始化了。如果在class中只有若干public型的數據成員,而沒有顯示定義任何構造函數,也可以使用花括號進行初始化。
(4)用sizeof運算符計算結構的大小時,要考慮結構體內部變量的對齊問題。
2.union
共用體(union),又名聯合體,是一種特殊的類,從C語言章繼承而來,其基本語義沒有發生什么變化,只是具有了類的一些特性(允許定義成員函數)。在實際的編程實踐中,使用頻率沒有struct高。與struct相比,最顯著的區別是union的數據成員共享同一段內存,以達到節省空間的目的。
2.1union的基本性質
通過如下程序考察union變量的占用空間,成員賦值時的相互影響。
#include <iostream> using namespace std; union testunion { char c; int i; }; int main(int argc,char* argv[]) { cout<<sizeof(testunion)<<endl; testunion* pt=new testunion; char* p=reinterpret_cast<char*>(pt); for(int i=0;i<sizeof(*pt);i++) cout<<int(p[i])<<" "; cout<<endl; cout<<pt->i<<endl; pt->c='A'; cout<<pt->c<<endl; for(int i=0;i<sizeof(*pt);i++) cout<<int(p[i])<<" "; cout<<endl; cout<<pt->i<<endl; delete pt; }
程序運行結果:
4
-51 -51 -51 -51
-842150451
A
65 -51 -51 -51
-842150591
可以看出,union testunion變量的體積是4,它是由兩個數據成員中體積較大的一個(int)類型來決定的。對其中一個數據成員的修改,一定會同時改變所有其他數據成員的值。不過對體積較小的數據成員的修改,只會影響到該成員應該占用的那些字節,對超出部分(高位字節)沒有什么影響。
2.2union的高級特性
觀察如下程序。
#include <iostream> using namespace std; struct Student { int age; int score; Student(int a,int s) { age=a; score=s; } }; union testunion { char c; int i; }; class someClass { int num; public: void show(){cout<<num<<endl;} }; union A { char c; int i; double d; someClass s; }; union B { char c; int i; double d; B(){d=8.9;} }; union { char c; int i; double d; void show(){cout<<c<<endl;} }u={'U'}; int main(int argc,char* argv[]) { A a={'A'}; B b; cout<<a.c<<endl; cout<<b.d<<endl; a.s.show(); u.show(); //匿名共用體 union { int p; int q; }; p=3; cout<<q<<endl; }
程序運行結果:
A
8.9
65
U
3
閱讀以上程序,需要注意以下幾點:
(1)union可以指定成員的訪問權限,默認情況下,與struct具有一樣的權限(public)。
(2)union也可以定義成員函數,包括構造函數和析構函數。與struct不同的是,它不能作為基類被繼承。
(3)union不能擁有靜態數據成員或引用成員,因為靜態數據成員實際上并不是共用體的數據成員,它無法和共用體的其它數據成員共享空間。對于引用變量,引用本質上是一個指針常量,它的值一旦初始化就不允許修改。如果共用體有引用成員,那么共用體對象一創建初始化后就無法修改,只能作為一個普通的引用使用,這就失去了共用體存在的意義。
(4)union允許其他類的對象成為自己的數據成員,但是要求該類對象所屬類不能定義constructor,copy constructor,destructor,assignment operator,virtual function中的任意一個。因為:
(4.1)union數據成員共享內存,union構造函數在執行的時候,不能調用數據成員為類對象的構造函數,否則就改變了其他數據成員的值。
(4.2)同樣,union的對象成員的析構函數也不能被調用,因為其他數據成員的值對于對象成員而言可能毫無意義。
(4.3)union的對象成員的賦值應該維持其原始語義,不建議進行賦值運算符的重載,因為賦值運算符重載一般用于“深拷貝”等場合,而在對象空間與其它變量共享的情況下,“深拷貝”引入的內存資源,指向內存資源的指針往往會被其它共用體數據成員修改,導致內存資源無法尋址,造成內存泄漏。此外,因為union的對象成員沒有自定義的析構函數,也會導致內存泄漏。
(4.4)擁有虛函數的類對象,虛函數表指針可能會在共用體對象初始化時被覆蓋,導致無法尋址虛函數表,所以也不能擁有虛函數。
(5)如果union類型旨在定義該類的同時使用一次,以后不再使用了,那么也可以不給出union的名稱。如上例中變量u就是這種情況,這種情況下,無法為該union定義構造函數。
(6)匿名共用體(Anonymous Union),也就是給出一個不帶名稱的共用體的申明后,并不定義任何該union的變量,而是直接以分號結尾。嚴格來說,匿名共用體并不是一種數據結構,因為它不能用來定義共用體對象,它只是指明若干個變量共享一片內存單元。在上例中,對變量p的修改實際上修改了變量q。可以看出,盡管匿名共用體中的變量被定義在同一個共用體中,他們與同一個程序塊的任何其他局部變量具有相同的作用域級別。這意味著匿名共用體內的成員的名稱不能與同一個作用域內的其它標識符相沖突。另外,對匿名共用體還存在如下限制:
(6.1)匿名共用體不允許有成員函數;
(6.2)匿名共用體也不能包含私有或者保護成員;
(6.3)全局匿名共用體中的成員必須是全局或靜態變量。
以上是C++ 結構體struct與共用體union是什么的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。