程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++的struct和union

C++的struct和union

編輯:關於C++

編碼運行環境:VS2012+Win32+Debug
Win32既表示運行平台是Windows 32bits操作系統,又表示生成32bits的應用程序。


結構體(struct)與聯合體(union)是C語言中就已經存在的數據類型。C++語言對他們進行了擴充,最大的變化是允許在結構和聯合體中定義成員函數。下面將通過實例講解二者的特性和用法。

1.struct

以下是一個使用了結構的C++程序。

#include 
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:1-101 2-201 3-301
the student’s age:18 score:89
閱讀以上程序,在C++中使用結構體(struct)要注意一下幾點:
(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運算符計算結構的大小時,要考慮結構體內部變量的對齊問題。

請牢記,在struct中默認訪問權限是public,這是結構和類的唯一區別。

2.union

聯合(union)是一種特殊的類,很少用但很有用。它是從C語言章繼承而來的,其基本予以沒有發生什麼變化,只是具有了類的一些特性(允許定義成員函數)。與結構不同的是,聯合中的數據成員共享了一段內存,以達到節省空間的目的。

2.1union的基本性質

通過如下程序考察union變量的占用空間,成員賦值時的相互影響。

#include 
using namespace std;
union testunion{
    char c;
    int i;
};
int main(int argc,char* argv[])
{
    cout<(pt);
    for(int i=0;ii<c='A';
    cout<c<i<

程序運行結果:
4
-51 -51 -51 -51
-842150451
A
65 -51 -51 -51
-842150591

可以看出,union testunion變量的體積是4,它是由兩個數據成員中體積較大的一個(int)類型來決定的。對其中一個數據成員的修改,一定會同時改變所有其他數據成員的值。不過對體積較小的數據成員的修改,只會影響到該成員應該占用的那些字節,對超出部分(高位字節)沒有什麼影響。

2.2union的高級特性

觀察如下程序。

#include 
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<

程序運行結果:
A
8.9
65
U
3
閱讀以上程序,需要注意以下幾點:

(1)union可以指定成員的訪問權限,默認情況下,與struct具有一樣的權限(public)。

(2)union也可以定義成員函數,包括構造函數和析構函數。與struct不同的是,它不能作為基類被繼承。

(3)union不能擁有靜態數據成員或引用成員,因為靜態數據成員實際上並不是聯合體的數據成員,它無法和聯合體的其它數據成員共享空間。對於引用變量,引用本質上是一個指著常量,它的值一旦初始化就不允許修改。如果聯合體有引用成員,那麼聯合體對象一創建初始化後就無法修改,只能作為一個普通的引用使用,這就失去了聯合體存在的意義。

(4)union允許其他類的對象成為自己的數據成員,但是要求該類對象所屬類不能定義constructor,copy constructor,destructor,copy assignment operator, virtual function中的任意一個。如此設計時局域共享內存的考慮。

(5)如果union類型旨在定義該類的同時使用一次,以後不再使用了,那麼也可以不給出union的名稱。如上例中變量u就是這種情況,這中情況下,無法為該union定義構造函數。

(6)匿名聯合(anonymous union),也就是給出一個不帶名稱的聯合體的申明後,並不定義任何該union的變量,而是直接以分號結尾。嚴格來說,匿名聯合並不是一種數據結構,因為它不能用來定義變量,它只是指明若干個變量共享一片內存單元。在上例中,對變量p的修改實際上就是修改了變量q。可以看出,盡管匿名聯合中的變量,盡管被定義在一個聯合申明中,他們與同一個程序塊的任何其他局部變量具有相同的作用域級別。這意味著匿名聯合內的成員的名稱不能與同一個作用域內的其它標識符相沖突。

另外,對匿名聯合還存在如下限制:
- 匿名聯合不允許有成員函數;
- 匿名聯合也不能包含私有或者保護成員;
- 全局匿名聯合中的成員必須是全局或靜態變量。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved