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的友元。

猜你喜欢

转载自blog.csdn.net/Harington/article/details/85217776