友元

友元的作用

c++中类的出现就是为了保证某些成员的私有性,但是有时候我们又需要在其他地方访问这些成员,这样该怎么做,友元的出现就是解决这个问题。

友元的语法格式:

1.friend关键字只出现在声明处

2.其他类、类成员函数、全局函数都可声明为友元

3.友元函数不是类的成员,不带this指针

4.友元函数可访问对象任意成员属性,包括私有属性

友元的实例

1.全局函数做友元函数

#define  _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
class Building{
	friend void visit();//当在类内声明这个友元函数后,这个函数就可以访问到内部私有的函数
	private :
		string bedRoom;
	public:
		string door;
		Building(){
			this->door = "门";
			this->bedRoom = "卧室";
		}
};
void visit(){
	Building * building = new Building;
	cout << "有人正在敲" << building->door << endl;
	cout << "有人进入了你的" << building->bedRoom << endl;
}
int main(){
        visit();
	system("pause");
	return EXIT_SUCCESS;
}

代码解释:

当未在类中声明friend void visit();时(其实这一行代码就是函数原型前面加了一个friend关键字)visit()函数将会报错。

一旦在类中声明了上述一行代码,则visit()作为类中指定的友元函数,将能够访问类中的私有属性。

2.类作为友元类

#define  _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
class Building;
class Person{
public:
	void visit();
	Person();
private:
	Building * building;
};
class Building{
	friend class Person;
	public:
		string sittingRoom;
		Building(){
			this->sittingRoom = "客厅";
			this->bedRoom = "卧室";
		}
	private:
		string bedRoom;
};
Person::Person(){
	this->building = new Building;
}
void Person::visit(){
	cout << building->sittingRoom << endl;
	cout << building->bedRoom << endl;
}

int main(){
	Person().visit();
	system("pause");
	return EXIT_SUCCESS;
}

代码解释:

friend class Person;在此处声明友元类说明这个类可以访问所声明在的类中的私有属性

3.

#define  _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
class Building;
class Person{
public:
	void visit();
	Person();
private:
	Building * building;
};
class Building{
	friend void Person::visit();
	public:
		string sittingRoom;
		Building(){
			this->sittingRoom = "客厅";
			this->bedRoom = "卧室";
		}
	private:
		string bedRoom;
};
Person::Person(){
	this->building = new Building;
}
void Person::visit(){
	cout << building->sittingRoom << endl;
	cout << building->bedRoom << endl;
}

int main(){
	Person().visit();
	system("pause");
	return EXIT_SUCCESS;
}

代码解释:

friend void Person::visit();这个声明说明Person类中的visit()方法可以访问声明友元函数的类中的私有属性

注意:

1.友元关系不能被继承。

2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。

3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友。

 

你可能感兴趣的:(C++)