友元
正常来说,类内的私有属性是无法被外界访问的,但如果访问对象被类标记成友元,那么就可以访问到私有的属性
形象的说:
客人到你的家做客一般是在客厅(Public),无法进入到你的卧室(Private),但是如果是经过你认可的好朋友(友元),就可以随意进到你的卧室去
全局函数做友元
被声明为友元的全局函数内可以访问该类的私有属性
class Animal {
firend void fun(Animal* b);//声明全局函数做友元
private
int data;//私有成员属性
};
void fun(Animal* b){
cout << "正在访问: " << b->data << endl;
//理论私有成员是无法访问的
//但fun函数被Animal类声明为友元,fun函数内就可以访问了
}
类做友元
被声明为友元的类内可以访问该类的私有属性
class Animal;//声明
class Botany {
public:
Botany();//构造函数,类内声明,类外实现
void fun();//函数声明
private:
Animal *animal;
};
class Animal {
firend class Animal;//声明类做友元
private
int data;//私有成员属性
};
//Botany类的成员函数实现
Botany::botany()
{
animal = new Animal;//实例一个Animal类
}
void Botany::fun(){
cout << "正在访问: " << animal->data << endl;
//理论私有成员是无法访问的
//但Botany类被Animal类声明为友元,Botany类就可以访问了
}
成员函数做友元
只让类内的某个成员函数做友元,只有这个成员可以访问私有属性,类的其他函数无法访问
继续使用上一个例程:
class Animal;//声明
class Botany {
public:
Botany();//构造函数,类内声明,类外实现
void fun();//函数声明
void fun2();
private:
Animal *animal;
};
class Animal {
//firend class Animal;//声明类做友元
friend void Animal::fun();//声明成员函数为友元
private
int data;//私有成员属性
};
//Botany类的成员函数实现
Botany::botany()
{
animal = new Animal;//实例一个Animal类
}
void Botany::fun(){
cout << "正在访问: " << animal->data << endl;
//这个成员函数被Animal类声明为友元,可以正常访问
}
void Botany::fun2(){
cout << "正在访问: " << animal->data << endl;
//这个成员函数没被Animal类声明为友元,无法访问,报错
}