友元的作用
c++中类的出现就是为了保证某些成员的私有性,但是有时候我们又需要在其他地方访问这些成员,这样该怎么做,友元的出现就是解决这个问题。
友元的语法格式:
1.friend关键字只出现在声明处
2.其他类、类成员函数、全局函数都可声明为友元
3.友元函数不是类的成员,不带this指针
4.友元函数可访问对象任意成员属性,包括私有属性
友元的实例
1.全局函数做友元函数
#define _CRT_SECURE_NO_WARNINGS
#include<string>
#include<iostream>
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<iostream>
#include<string>
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<iostream>
#include<string>
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的朋友。