亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入了解C++ 結(jié)構(gòu)體(struct)與共用體(union)

 更新時間:2020年08月11日 11:50:40   作者:Dabelv  
這篇文章主要介紹了C++ 結(jié)構(gòu)體與共用體的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

編碼運(yùn)行環(huán)境:VS2017+Win32+Debug,Win32表示生成32bits的應(yīng)用程序。

結(jié)構(gòu)體(struct)與共用體(union)是C語言中就已經(jīng)存在的數(shù)據(jù)類型,C++對他們進(jìn)行了擴(kuò)充,最大的變化是允許在結(jié)構(gòu)和公用體中定義成員函數(shù)。下面將通過實例講解二者的特性和用法。

1.struct

以下是一個使用了結(jié)構(gòu)體的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();
}

程序運(yùn)行結(jié)果:

the room are:1-101 2-201 3-301
the student's age:18 score:89

閱讀以上程序,在C++中使用結(jié)構(gòu)體需要注意以下幾點(diǎn):

 (1)C++中,結(jié)構(gòu)體是一種真正的數(shù)據(jù)類型,在利用結(jié)構(gòu)定義變量時,不需要像在C中帶上struct關(guān)鍵字,或先使用typedef struct structname structalias的方式進(jìn)行申明。

(2)C++對C中的struct進(jìn)行了擴(kuò)充,允許在struct中定義成員函數(shù)。struct中的成員變量和成員函數(shù)也有訪問權(quán)限,在class中,默認(rèn)的訪問權(quán)限是private,而在struct中默認(rèn)訪問權(quán)限是public,這是結(jié)構(gòu)體和類的唯一區(qū)別。struct成員的默認(rèn)訪問權(quán)限設(shè)為public是C++保持與C語言兼容而采取的一項策略。

(3)如果struct中沒有顯示定義任何構(gòu)造函數(shù),那么結(jié)構(gòu)變量可以像在C語言中那樣用花括號順序指明數(shù)據(jù)成員的值來進(jìn)行初始化。但是一旦顯示定義了任何一個構(gòu)造函數(shù),就不能用這種方式初始化了。如果在class中只有若干public型的數(shù)據(jù)成員,而沒有顯示定義任何構(gòu)造函數(shù),也可以使用花括號進(jìn)行初始化。

(4)用sizeof運(yùn)算符計算結(jié)構(gòu)的大小時,要考慮結(jié)構(gòu)體內(nèi)部變量的對齊問題。

2.union

共用體(union),又名聯(lián)合體,是一種特殊的類,從C語言章繼承而來,其基本語義沒有發(fā)生什么變化,只是具有了類的一些特性(允許定義成員函數(shù))。在實際的編程實踐中,使用頻率沒有struct高。與struct相比,最顯著的區(qū)別是union的數(shù)據(jù)成員共享同一段內(nèi)存,以達(dá)到節(jié)省空間的目的。

2.1union的基本性質(zhì)

通過如下程序考察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;
}

程序運(yùn)行結(jié)果:

4
-51 -51 -51 -51
-842150451
A
65 -51 -51 -51
-842150591

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

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;
}

程序運(yùn)行結(jié)果:

A
8.9
65
U
3

閱讀以上程序,需要注意以下幾點(diǎn):

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

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

 (3)union不能擁有靜態(tài)數(shù)據(jù)成員或引用成員,因為靜態(tài)數(shù)據(jù)成員實際上并不是共用體的數(shù)據(jù)成員,它無法和共用體的其它數(shù)據(jù)成員共享空間。對于引用變量,引用本質(zhì)上是一個指針常量,它的值一旦初始化就不允許修改。如果共用體有引用成員,那么共用體對象一創(chuàng)建初始化后就無法修改,只能作為一個普通的引用使用,這就失去了共用體存在的意義。

 (4)union允許其他類的對象成為自己的數(shù)據(jù)成員,但是要求該類對象所屬類不能定義constructor,copy constructor,destructor,assignment operator,virtual function中的任意一個。因為:
  (4.1)union數(shù)據(jù)成員共享內(nèi)存,union構(gòu)造函數(shù)在執(zhí)行的時候,不能調(diào)用數(shù)據(jù)成員為類對象的構(gòu)造函數(shù),否則就改變了其他數(shù)據(jù)成員的值。
  (4.2)同樣,union的對象成員的析構(gòu)函數(shù)也不能被調(diào)用,因為其他數(shù)據(jù)成員的值對于對象成員而言可能毫無意義。
  (4.3)union的對象成員的賦值應(yīng)該維持其原始語義,不建議進(jìn)行賦值運(yùn)算符的重載,因為賦值運(yùn)算符重載一般用于“深拷貝”等場合,而在對象空間與其它變量共享的情況下,“深拷貝”引入的內(nèi)存資源,指向內(nèi)存資源的指針往往會被其它共用體數(shù)據(jù)成員修改,導(dǎo)致內(nèi)存資源無法尋址,造成內(nèi)存泄漏。此外,因為union的對象成員沒有自定義的析構(gòu)函數(shù),也會導(dǎo)致內(nèi)存泄漏。
  (4.4)擁有虛函數(shù)的類對象,虛函數(shù)表指針可能會在共用體對象初始化時被覆蓋,導(dǎo)致無法尋址虛函數(shù)表,所以也不能擁有虛函數(shù)。

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

 (6)匿名共用體(Anonymous Union),也就是給出一個不帶名稱的共用體的申明后,并不定義任何該union的變量,而是直接以分號結(jié)尾。嚴(yán)格來說,匿名共用體并不是一種數(shù)據(jù)結(jié)構(gòu),因為它不能用來定義共用體對象,它只是指明若干個變量共享一片內(nèi)存單元。在上例中,對變量p的修改實際上修改了變量q。可以看出,盡管匿名共用體中的變量被定義在同一個共用體中,他們與同一個程序塊的任何其他局部變量具有相同的作用域級別。這意味著匿名共用體內(nèi)的成員的名稱不能與同一個作用域內(nèi)的其它標(biāo)識符相沖突。另外,對匿名共用體還存在如下限制:
   (6.1)匿名共用體不允許有成員函數(shù);
   (6.2)匿名共用體也不能包含私有或者保護(hù)成員;
   (6.3)全局匿名共用體中的成員必須是全局或靜態(tài)變量。

以上就是深入了解C++ 結(jié)構(gòu)體(struct)與共用體(union)的詳細(xì)內(nèi)容,更多關(guān)于C++ 結(jié)構(gòu)體與共用體的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c語言實現(xiàn)通訊錄管理系統(tǒng)詳細(xì)實例

    c語言實現(xiàn)通訊錄管理系統(tǒng)詳細(xì)實例

    這篇文章主要給大家介紹了關(guān)于c語言實現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,通訊錄管理系統(tǒng)是一種常見的應(yīng)用程序,可以用來管理聯(lián)系人的信息,包括姓名、電話號碼、地址等,需要的朋友可以參考下
    2023-07-07
  • 字典樹的基本知識及使用C語言的相關(guān)實現(xiàn)

    字典樹的基本知識及使用C語言的相關(guān)實現(xiàn)

    這篇文章主要介紹了字典樹的基本知識及使用C語言的相關(guān)實現(xiàn),這也是ACM等計算機(jī)考試和競賽題目的基本知識,需要的朋友可以參考下
    2015-08-08
  • 詳解C語言中accept()函數(shù)和shutdown()函數(shù)的使用

    詳解C語言中accept()函數(shù)和shutdown()函數(shù)的使用

    這篇文章主要介紹了詳解C語言中accept()函數(shù)和shutdown()函數(shù)的使用,用來操作socket相關(guān)的網(wǎng)絡(luò)通信,需要的朋友可以參考下
    2015-09-09
  • C++ 項目引入lib和dll的區(qū)別與使用實戰(zhàn)

    C++ 項目引入lib和dll的區(qū)別與使用實戰(zhàn)

    靜態(tài)鏈接庫與動態(tài)鏈接庫都是共享代碼的方式,本文主要介紹了C++項目引入lib和dll的區(qū)別與使用實戰(zhàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • C++基于Directx MMX實現(xiàn)的圖像灰度轉(zhuǎn)換代碼

    C++基于Directx MMX實現(xiàn)的圖像灰度轉(zhuǎn)換代碼

    這篇文章主要介紹了C++基于Directx MMX實現(xiàn)的圖像灰度轉(zhuǎn)換代碼,需要的朋友可以參考下
    2014-08-08
  • Dijkstra算法最短路徑的C++實現(xiàn)與輸出路徑

    Dijkstra算法最短路徑的C++實現(xiàn)與輸出路徑

    今天小編就為大家分享一篇關(guān)于Dijkstra算法最短路徑的C++實現(xiàn)與輸出路徑,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++之預(yù)處理功能詳解

    C++之預(yù)處理功能詳解

    預(yù)處理器是 C++ 編譯器提供的一個工具,允許程序員在編譯之前對源代碼文件做出修改,本文將給大家通過代碼示例詳細(xì)介紹C++的預(yù)處理功能,需要的朋友可以參考下
    2023-05-05
  • C++使用MFC獲取PC硬件配置信息

    C++使用MFC獲取PC硬件配置信息

    這篇文章主要為大家詳細(xì)介紹了C++使用MFC獲取PC硬件配置信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])

    C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])

    這篇文章主要介紹了C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 一文帶你學(xué)會C語言中的qsort函數(shù)

    一文帶你學(xué)會C語言中的qsort函數(shù)

    qsort函數(shù)是C語言的庫函數(shù),能實現(xiàn)對各種元素類型的比較,使用的基本思想是快速排序法,頭文件是<stdlib.h>,本文不講解具體實現(xiàn)原理,只對使用方法進(jìn)行說明,希望對大家有所幫助
    2022-12-12

最新評論