1. 程式人生 > >C++學習 18-11-23

C++學習 18-11-23

C++學習 18-11-23

1.常量成員(const成員)

1.在公有屬性中定義一個 const int m_age;(常量成員),則一定需要在初始化列表中初始化。

class CPerson
{
private:
	const int n_age;								// 常量成員,一定要在初始化列表中初始化
	int n_name;

public:
	CPerson():n_age(123), n_name(100)				// 初始化列表
	{

	}
};

2.常量函式(const函式)

1.不能修改類中的成員屬性

class CPerson
{
private:
const int n_age; // 常量成員,一定要在初始化列表中初始化 int n_name; public: CPerson():n_age(123), n_name(100) // 初始化列表 { } public: void Show() { n_name++; } void ConstShow() const // 常函式,不能修改類中的成員屬性,因為this已經變為了const { n_name++; } };

3.常量物件(const物件)

1.只能使用常函式,普通函式不能呼叫。

class CPerson
{
private: const int n_age; // 常量成員,一定要在初始化列表中初始化 int n_name; public: CPerson():n_age(123), n_name(100) // 初始化列表,常量成員必須在此處初始化,普通成員可以在此處,也可以在建構函式裡 { } public: void Show() { n_name++; } void ConstShow() const // 常函式,不能修改類中的成員屬性,因為this已經變為了const { n_name++; } }; int main() { CPerson ps1;
ps1.Show(); ps1.ConstShow(); // 會出錯,不可呼叫 const CPerson ps2; ps2.Show(); // 會出錯,不可呼叫 ps2.ConstShow(); system("pause"); return 0; }

4.安全性只能升級,不能降級

1.可以進行下列操作

int a = 100;
const int *p1 = &a;

// 以下程式是錯誤的
const int b = 120;
int *p2 = &b;

5.類之間的關係

1.建立一個建模專案->UML類圖。

這種類圖是用來直觀的表示程式中各個類之間的關係的圖。

2.類之間的關係分為兩大類: 橫向關係和縱向關係

縱向關係就是繼承關係,它的概念非常明確,也成為面向物件程式設計的三個重要特徵之一。
橫向關係較為微妙,按照UML的建議大體上可以分為四種:
1.依賴    (Dependency)
2.關聯    (Association)
3.聚合    (Aggregation)
4.組合    (Composition)
它們的強弱關係是沒有異議的:依賴 < 關聯 < 聚合 < 組合

3.建立一個組合關係的類

1.首先定義一個CPerson類,該類可以完成PersonSay()函式,這個函式是由兩個物件的函式組成;
2.定義一個CHead類,該類完成的是PersonSay()函式中的一個物件的函式呼叫;
3.定義一個CHand類,該類完成的是PersonSay()函式中的另一個物件的函式呼叫;
4.在這個過程當中,CHead類與CHand類的關係就是組合關係。

class CHead
{
public:
	void Say()
	{
		cout << "Head Mouth Say!" << endl;
	}	
};

class CHand
{
public:
	void HandMove()
	{
		cout << "Hand Move!" << endl;
	}
};

class CPerson
{
private:
	CHead ps_head;
	CHand ps_hand;

public:
	CPerson()
	{

	}

public:
	void PersonSay()
	{
		ps_head.HeadSay();
		ps_hand.HandMove();
	}

};

int main()
{
	CPerson ps1;
	ps1.PersonSay();



	system("pause");
	return 0;
}

4.定義一個依賴關係

1.首先定義一個CComputer類,這個類中可以實現Code函式;
2.其次在CPerson類中定義一個Coding函式,傳入CComputer類物件的引用,並在其中呼叫該物件的Code函式。

class CComputer
{
public:
	void Code()
	{
		cout << "碼程式碼..." << endl;
	}
};

class CPerson
{
private:
	

public:
	CPerson()
	{

	}

public:
	void Coding(CComputer& cp)
	{
		cp.Code();
	}

};

int main()
{
	CPerson ps1;
	ps1.Coding();



	system("pause");
	return 0;
}

5.定義一個關聯關係類

1.首先需要理解什麼是關聯關係,所謂關聯就是某個物件會長期的持有另一個物件的引用,而二者的關聯往往也是相互的。關聯的兩個物件彼此間沒有任何強制性的約束,只要二者同意,可以隨時解除關係或是進行關聯,它們在生命期問題上沒有任何約定。被關聯的物件還可以再被別的物件關聯,所以關聯是可以共享的。
2.建立一個朋友CFriend類,其中包括friend的人品,人品大於等於5則可以交朋友。

#include<iostream>
#include<time.h>

using namespace std;

class CFriend
{
public:
	int f_rp;

public:
	CFriend()
	{
		f_rp = rand() % 10;
	}

public:
	void PlayTogether()
	{
		cout << "爸爸帶你飛..." << endl;
	}
};

class CPerson
{
private:
	CFriend *p_friend;

public:
	CPerson()
	{
		p_friend = 0;
	}

public:
	void FindFriend(CFriend *one_friend)
	{
		if(one_friend->f_rp >= 5)
		{
			p_friend = one_friend;
		}
	}

	void LOL()
	{
		if(p_friend)
		{
			p_friend->PlayTogether();
		}
		else
		{
			cout << "孤獨..." << endl;
		}
	}

};

int main()
{
	srand((unsigned int)time(0));

	CFriend new_friend;

	CPerson ps1;
	ps1.FindFriend(&new_friend);
	ps1.LOL();


	system("pause");
	return 0;
}

6.定義一個聚合類

class CPerson
{
private:

public:
	CPerson()
	{
		
	}

public:
	

};

class CFamily
{
private:
	CPerson *p_family[10];

public:
	CFamily()				// 初始化家庭指標陣列為空(每個元素都為0)
	{
		for(int i=0; i<10; i++)
		{
			p_family[i] = 0;
		}
	}

public:
	void PushPerson(CPerson *person)
	{
		int count = 0;
		while(p_family[count])
		{
			count++;
		}

		p_family[count] = person;
	}
};

int main()
{
	CPerson ps1;

	CFamily family;
	family.PushPerson(&ps1);




	system("pause");
	return 0;
}

7.依賴關係和關聯關係沒有生命週期,組合關係和聚合關係是有生命週期的。

7.整體程式

#include <iostream>
#include <time.h>
#include <string>

using namespace std;

class CHead
{
private:

public:
	void HeadSay()
	{
		cout << "HeadSay" << endl;
	}
};

class CHand
{
private:

public:
	void HandMove()
	{
		cout << "HandMove" << endl;
	}
};

// 定義一個與CPerson呈依賴關係的CComputer類
class CComputer
{
public:
	void Code()
	{
		cout << "碼程式碼...." << endl;
	}
};

// 定義一個關聯類
class CFriend
{
public:
	int f_rp;

public:
	CFriend()
	{
		f_rp = 10;
	}

public:
	void PlayTogher()
	{
		cout << "爸爸帶你飛" << endl;
	}
};

class CPerson
{
private:
	CHead head;
	CHand hand;
	CFriend *p_friend;

public:
	CPerson()
	{
		p_friend = 0;
	}

	
public:
	void FindFriend(CFriend *one_friend)
	{
		if(one_friend->f_rp >= 5)
			p_friend = one_friend;
	}

	void Play()
	{
		if(p_friend)
			p_friend->PlayTogher();
		else
		{
			cout << "我自己飛" << endl;
		}
	}

	void PersonSay()
	{
		head.HeadSay();
		hand.HandMove();
	}

	void Coding(CComputer& cp)
	{
		cp.Code();
		cout << "掉頭髮....." <<endl;
	}
};

// 定義一個與CPerson是聚合關係的類
class CFamily
{
public:
	CPerson *p_family[10];

public:
	CFamily()
	{
		for(int i=0; i<10; i++)
			p_family[i] = 0;
	}

public:
	void PushPerson(CPerson *person)
	{
		int i = 0;
		while (p_family[i])
		{
			i++;
		}
		p_family[i] = person;
	}

	void AllFamilyCoding(CComputer& cp)
	{
		int i = 0;
		while (p_family[i])
		{
			p_family[i]->Coding(cp);
			i++;
		}
	}

};

int main()
{
	srand((unsigned int)time(0));

	CComputer cp;
	CFriend one_friend;

	CPerson ps1;
	ps1.PersonSay();
	ps1.Coding(cp);
	ps1.FindFriend(&one_friend);
	ps1.Play();


	// 測試CFamily類
	CFamily c_family;
	c_family.PushPerson(&ps1);
	c_family.AllFamilyCoding(cp);

	system("pause");
	return 0;
}