1. 程式人生 > >C++學習筆記——建構函式例項

C++學習筆記——建構函式例項

/************************************************************************************************************************************************
1.    面向物件的四個特徵:(1)抽象(2)封裝(3)繼承(4)多型
2.    用關鍵字class宣告一個類,沒有為該類分配記憶體,他只是告訴編譯器該類是什麼,它包含了哪些型別的資料和功能。
    同時他還告訴編譯器該類有多大。類的大小是根據該類的變數的資料型別來確定的。
3.    要使用類名來定義一個物件。運算子來訪問該物件的資料成員以及成員函式並且可以給物件的資料成員賦值。物件只能呼叫類中存在的方法。
4.    類的成員函式與資料成員預設為私有,可以用關鍵字 public宣告為公有,private宣告為私有,protected說明為保護,virtual說明為虛擬函式。
5.    標頭檔案與原始檔:標頭檔案以.h格式,原始檔以.cpp格式。可以在.cpp檔案中載入.h的標頭檔案。可以把類定義在.h的標頭檔案中,然後在.cpp中呼叫這個.h的標頭檔案。
6.    函式是用來執行一定功能的程式碼塊,成員函式則是隻能被類的物件所使用的函式:物件只能使用該類提供的函式。
7.    類只是一個抽象的名詞,物件則是實際的個體,所以不要給類賦值。
8.const成員函式:如果不想讓某個成員函式修改成員變數的值,可以將這個成員函式宣告或定義為const成員函式。
************************************************************************************************************************************************/
/************************************************************************************************************************************************
行內函數
    用關鍵字inline來宣告函式為行內函數。當我們定義了一個函式後,編譯器就會在記憶體中為其建立一個指令集。當我們呼叫這個函式時,程式就會跳轉到該指令集處。
當該函式執行完畢後,程式又會返回到原來執行呼叫該函式語句的下一行繼續執行。當聲明瞭一個行內函數時,編譯器不會建立真正的函式,而只是將這個行內函數的所有
程式碼複製到呼叫函式中,這樣程式在執行呼叫該函式時就不需要來回跳轉,自然就提高了程式執行時的效率。行內函數又分顯示宣告和隱式宣告。在定義函式時在函式返回
值型別前加上inline關鍵字就是顯示宣告,將函式體直接放到函式頭後面也就是說函式的宣告和定義合併在一起,這種方法稱之為隱式宣告。也可以將類的成員函式說明為
行內函數inline 。
************************************************************************************************************************************************/
/************************************************************************************************************************************************
在面向物件程式中,類是最基本的資料型別,而物件則是用該型別定義出來的變數。
當定義某類的物件時,會自動呼叫該類的建構函式來初始化物件,而當該物件的壽命結束時,又會自動呼叫解構函式來回收它所佔用的記憶體。
類是實現面向物件程式設計的基礎,也是特殊的資料型別,它將資料和方法關聯起來。每個物件都可看作是資料和方法的集合。這樣可便於分類。類的成員可以是公有的或私有的。這意味著某人的隱私只有他自己知道,別人是無權過問的。這使得資料的安全性大大增強。
************************************************************************************************************************************************/

#include <iostream>
#include <string>

using namespace std;

class Human		//使用class關鍵字宣告一個類
{
public:			//宣告許可權是公有,如果不宣告預設為私有。公有成員允許該類的物件直接訪問,私有則不允許。
	Human()
	{			//在呼叫預設建構函式的時候會建立一個物件 !!!建構函式沒有返回值!!!
		total++;
		cout << "Human類的建構函式" << endl;
	}

	Human(int a) :age(a)
	{			//帶引數的建構函式,且初始化了資料成員變數
		total++;
		cout << "Human類的帶一個引數的建構函式" << endl;
	}

	Human(int x1, int x2, int x3) :height(x1), weight(x2), age(x3)
	{
		total++;
		cout << "Human類的帶三個引數的建構函式" << endl;
	}

	Human(Human const &hu)
	{			//複製建構函式,建立該物件的一個副本
		cout << "Human類的複製建構函式" << endl;
	}

	~Human()
	{			//在物件被銷燬後清楚該物件所佔用的記憶體,此時會被自動呼叫。解構函式沒有返回值!!!
		total--;
		cout << "Human類的解構函式" << endl;
	}

	void static showtotal()
	{			//靜態成員函式,只有類中的靜態函式才可以呼叫靜態成員
		cout << Human::total << endl;
	}

	void set_height(int h)
	{									//成員函式,作為設定private私有資料成員變數的介面來設定資料成員
		height = h;						//隱式行內函數,定義和宣告合併在一起
	}

	void set_weight(int w)
	{
		weight = w;
	}

	void set_age(int a)
	{
		age = a;
	}

	inline void set_name(string);		//在類中宣告顯式行內函數,然後在類外定義該函式。

	int get_height()			//成員函式,返回賦值後的私有成員變數的值。
	{
		return height;
	}

	int get_weight()
	{
		return weight;
	}

	int get_age()
	{
		return age;
	}

	void const get_name() const		//用關鍵字const將get_name()函式宣告為常量
	{
		cout << name << endl;
	}



private:				//宣告為私有,私有成員不能直接訪問,必須通過公有成員或成員函式作為接口才可以訪問
	static int total;		//宣告為靜態成員變數,靜態成員變數不屬於任何物件,只屬於類。
	int height;		//資料成員變數
	int weight;
	int age;
	string name;
};

int Human::total = 0;	//在類外為Human類的靜態成員變數賦值(全域性變數)

void Human::set_name(string n)	//在類外定義類的內聯成員函式
{
	name = n;
}

inline double func(double, double, char);	//用inline關鍵字把func函式宣告為行內函數

double func(double a, double b, char c)		//內聯func函式的定義部分
{
	if (c == '+')
	{
		return a + b;
	}
	else if (c == '-')
	{
		return a - b;
	}
	else if (c == '*')
	{
		return a * b;
	}
	else if (c == '/')
	{
		return a / b;
	}
	else
	{
		cout << "無法解析的運算" << endl;
	}
	return 0;
}

int main()
{
	Human zhangsan;			//定義了一個Human類的物件
	zhangsan.set_age(28);		//通過公有函式set_age作為介面設定私有成員變數age的值
	zhangsan.set_height(168);
	zhangsan.set_weight(70);
	zhangsan.set_name("張三");		//通過共有成員函式set_name(作為介面設定私有成員變數) string name的值,字串要用雙引號括起來"" 。
	cout << "身高" << zhangsan.get_height() << "CM,體重" << zhangsan.get_weight() << "KG,年齡" << zhangsan.get_age() << "歲." << endl;
	cout << "姓名:";
	zhangsan.get_name();
	Human::showtotal();		//呼叫靜態成員函式,因為靜態成員函式作為靜態成員變數的介面,所以可以間接訪問到靜態成員變數。
	Human mike(45, 170, 80);		//定義了Human類的一個物件且帶三個引數,會自動呼叫Human類中帶三個引數的建構函式。
	cout << mike.get_age() << mike.get_height() << mike.get_weight() << endl;
	double a, b;
	char c;
	cout << "單目運算式" << endl << "請輸入要進行計算的算術式,例如:3.14*100,不可寫成雙目例如3.14*10*10 !" << endl;
	cin >> a >> c >> b;
	cout << "您要進行的計算式為:" << a << c << b << endl;
	cout << "運算式的結果為" << a << c << b << "=" << func(a, b, c) << endl;
	Human man[5];		//建立一個由5個Human類的物件組成的陣列,物件陣列。
	(*man).set_name("張五");		//man代表陣列man[5]中的第一個元素的首地址。(*man)取第一個元素的首地址處的資料也就是Human類
									//在陣列man[5]中的第一個物件。然後用.操作符呼叫該物件的成員函式set_get()來設定私有成員變數name
	(*man).get_name();		//呼叫成員函式get_name來輸出私有成員變數name。(*man)同等於(man[0])
	man[2].set_age(30);		//呼叫陣列man[5]中第三個元素也就是陣列中的第三個Human類的物件的成員函式set_age()來設定私有成員變數age的值
	cout << man[2].get_age() << endl;		//輸出陣列man[2]中下標為2(地三個元素(物件))的Human類的物件的成員函式get_age()的返回值age
	return 0;
}