C++結構體,聯合體與枚舉類


結構體:

C++的結構體可以理解為C語言結構體的升級版,也可以理解為特殊的類,很少用,目的是和C語言保持兼容

與類的唯一區別是:類中的成員如果定義在類體的最開頭,既沒有訪問屬性(缺省訪問),則默認是私有的,而結構體相反默認是公有的


聯合體:

union 聯合體名稱
{
	公有成員
	protected:
		保護型成員
	private:
		私有成員
}

特點:①和C語言中的聯合一樣,成員共用同一組內存單元,任何兩個成員不會同時有效

②聯合體可以沒有名稱,例如下面:

union
{
	int n;
	double k;
}
int main(void)
{
	n = 10;
	k = 2.2;		//給f賦值后,之前n的值(10)就會被沖掉
}


枚舉類:

例如:

enum class Typename1 {General, Light, Medium, Heavy};

(不定義底層類型默認int,里面的值分別對應0,1,2,3)

enum class Typename2: char{General, Light, Medium, Heavy};

enum class Typename3 {General=4, Pistol, MachineGun, Cannon};(里面的值分別對應4,5,6,7)

特點:

①強作用域,其作用域限制在枚舉類中,例如調用時Typename1::Light和Typename2::Light是不一樣的

②枚舉類對象不可以與整型隱式地互相轉換

如下非法例子:

#include<iostream>
using namespace std;
enum class Side {Right, Left};
enum class Thing {Wrong, Right};
int main(void)
{
	Side s = Side::Right;
	Thing w = Thing::Wrong;
	cout<<(s==w)<<endl;		//編譯錯誤,無法直接比較不同枚舉類
	return 0;
}


樣例:

#include<iostream>
#include<string>
using namespace std;
class ExamInfo
{
	public:
		ExamInfo(string name, char a): Name(name), mode(評級), level(a) {}
		ExamInfo(string name, bool a): Name(name), mode(通過情況), pass(a) {}
		ExamInfo(string name, int a): Name(name), mode(分數), score(a) {}
		void show();
	private:
		string Name;
		enum {評級, 通過情況, 分數} mode;		//這只算個枚舉,不算做枚舉類
		union
		{
			char level;	
			bool pass;
			int score;
		};
};

void ExamInfo::show()
{
	cout<<Name<< ": ";
	switch(mode)
	{
		case 評級:  cout<<level;  break;
		case 通過情況:  cout<<(pass?"PASS":"FAIL");  break;
		case 分數:  cout<<score;
	}
	cout<<endl;
}

int main(void)
{
	ExamInfo c1("English", 'B');
	ExamInfo c2("Calculus", true);
	ExamInfo c3("C++ Programming", 85);
	c1.show();
	c2.show();
	c3.show();
	return 0;
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: