1. 程式人生 > >C++第三章(類和物件)下篇 (動態建立與釋放,物件的賦值和複製,靜態資料成員,友元)

C++第三章(類和物件)下篇 (動態建立與釋放,物件的賦值和複製,靜態資料成員,友元)

一,物件的動態建立與釋放

new (程式設計師怎麼會沒有朋友??? 來讓我給你new 一個)
在我學過的c中 我們一般都用 malloc 來動態申請空間。現在我們可以用new 來申請空間

Box *pt;
pt = new Box;

c++允許在new時進行賦值

Box *pt = new Box(12, 13, 5);

在我們不需要使用new建立的物件時 我們可以通過delete 運算子釋放

delete pt;

二,物件的賦值

類的成員中不能包括動態分配的資料。
一般形式 物件名1 = 物件名2

Student stu1,stu2;
stu2 =
stu1; Box box1(1, 2, 3), box2; box2 = box1;

三,物件的複製

形式: 類名 物件2(物件1)

 Box box2(box1);

 Box box2 = box1;

在物件的複製中,原理是在建立物件時呼叫一個特殊的建構函式——複製建構函式

Box::Box(const Box&b){
	height = b.height;
	width = b,width;
	length = b.length;
}

形式上:

類名(形參列表); //普通建構函式的宣告,如Box(int h, int w, int l);
類名(類名 &
物件名); //複製建構函式的宣告,如Box(Box &b);

四,靜態成員

如果有n個同類的物件,那麼每一個物件都分別有自己的資料成員,不同物件的資料成員各有各值,互不相干,但是有時人們希望有某一個或幾個資料成員為所有物件共有。這樣可以實現資料共享。
靜態資料成員就是多個物件共享的資料成員,給大家舉個栗子,
有幾個相鄰的學校,各個學校分別有自己的教學樓,實驗室,辦公樓,宿舍,食堂,圖書館,為了節約開支,共有資源,這幾個學校共建禮堂和運動場。每個學校都可以認為本校既有教學樓,實驗室,辦公樓,宿舍,食堂,圖書館又有禮堂和運動場。但是如果改變禮堂和運動場的大小與功能,就會影響所有的學校。
1)靜態資料成員

class Box{
	public:
		int volume();
	private:
		static int height;//靜態資料成員
		int width;
		int length;
};
靜態資料成員只能在類體外進行初始化
int Box::height = 10;

一般形式為
資料型別 類名::靜態資料成員名 = 初值;
(2)靜態成員函式

static int volume();

靜態成員函式是類的一部分而不是物件的一部分,如果在類外呼叫公用的靜態成員函式,是要用類名和域運算子 “ ::”

Box::volume();

靜態成員函式主要用來訪問靜態資料成員,而不訪問非靜態資料成員。
非靜態成員函式都可以訪問

五,友元

在一個類中可以有共有(public)成員和私有(private)成員,我們把客廳比喻成公用部分,用臥室比喻私有部分。類外可以訪問公用成員,只有在本類中的函式可以訪問本類的私有成員。現在我們來打破這個常規 來一個例外 (friend)
friend 的意思是朋友,臥室本來只能夠自己的家人進,客廳對外來所有客人開放,而你允許好朋友進入你的臥室。
你在類外定義了一個函式,然後在類體中宣告為友元,此函式就是這個類的友元函式
友元函式可以訪問這個類中的私有成員。

友元函式

#include<iostream>
using namespace std;
class Time{
	public :
		Time(int, int, int);
		friend void display(Time &);
	private :
		int hour;
		int minute;
		int sec;
		static int day;
};
int Time::day = 30;
Time::Time(int h, int m, int s){
	hour = h;
	minute = m;
	sec = s;
}
void display(Time &t){
	cout << t.hour << ": " << t.minute << ": " << t.sec << endl;
}
int main (){
	Time t1(1, 3, 3);
	display(t1);
	return 0;
}

友元成員函式

friend 函式不僅可以是一般函式(非成員函式),而且可以是另一個類中的成員函式

#include<iostream>
using namespace std;
class Date;			//對Date類的提前引用宣告 
class Time{
	public :
		Time(int, int, int);
		void display(Date &);
	private :
		int hour;
		int minute;
		int sec;
};
class Date{
	public:
		Date(int , int, int);
		friend void Time::display(Date &);
	private :
		int month;
		int day;
		int year;
};
Time::Time(int h, int m, int s){
	hour = h;
	minute = m;
	sec = s;
}
void Time::display(Date &d){
	cout << d.year << ": " << d.month << ": " << d.day << endl;
}
Date::Date(int y, int m, int d){
	year = y;
	month = m;
	day = d;
}
int main (){
	Time t1(1, 3, 3);
	Date d1(2018, 12, 22);
	t1.display(d1);
	return 0;
}

一個函式可以被多個類宣告為(friend),這樣就可以引用多個類中的私有資料

友元類

不僅僅可以將一個函式宣告為一個類的“朋友”,而且可以將一個類(例如類B)宣告為另一個類(例如類A)的“朋友”。這時類B就是A的友元類,友元類B中的所有函式都是類A的友元函式,可以訪問A中的所有成員,就像一個家庭,不僅允許一個好朋友進入他人的家庭,還允許朋友的全家人進入他家的臥室。

class B{
};
friend B;

(1)友元的關係是單向的。
(2)友元的關係不能傳遞,B是A的友元,C是B的友元,但是C不是A的友元。