上一篇博文提到了访问权限,想到友元可以改变访问权限,在这里记录一下。
友元用friend申请,其他类不可以访问本类型的私有成员,但是申请友元后侧可以访问。
一般友元有3种形式:
1)友元类 2)友元函数 3)友元成员函数
1友元类
class A;//第一步申明友元类
class B//第二步定义要申请友元的类(在类中申明友元关系)
{
public:
B(int _age):age(_age){}
friend A;//申明友元关系
private:
int age;
};
class A//第三步定义友元类
{
public:
void print(const B & b)
{
cout<<"B.age=="<<b.age<<endl;
}
};
class A;//第一步申明友元类
class B//第二步定义要申请友元的类(在类中申明友元关系)
{
public:
B(int _age):age(_age){}
friend A;//申明友元关系
private:
int age;
};
class A//第三步定义友元类
{
public:
void print(const B & b)
{
cout<<"B.age=="<<b.age<<endl;
}
};
2友元函数
class B//第一步定义要申请友元的类(在类中申明友元关系)
{
public:
B(int _age):age(_age){}
friend void print(const B & b);//申明友元关系
private:
int age;
};
//第二步定义友元函数
void print(const B & b)
{
cout<<"B.age=="<<b.age<<endl;
}
class B//第一步定义要申请友元的类(在类中申明友元关系)
{
public:
B(int _age):age(_age){}
friend void print(const B & b);//申明友元关系
private:
int age;
};
//第二步定义友元函数
void print(const B & b)
{
cout<<"B.age=="<<b.age<<endl;
}
3友元成员函数(最麻烦的一个)
class B;//第一步申明要申请友元的类(因为友元类中要用到它)
class A//第二部可以定义友元类(类中的友元成员函数除外,因为它要用到申请友元类的成员,而暂时申请友元的类并没有定义)
{
public:
A(){ cout<<"Run Constructor"<<endl;}
void test(){cout<<"Run test"<<endl;}
void print(const B & b);//申明类中友元成员函数,只是申明
};
class B//第三步定义要申请友元的类(在类中申明友元关系)
{
public:
B(int _age):age(_age){}
friend void A::print(const B & b);//申明友元关系
private:
int age;
};
//第四部定义友元成员函数
void A::print(const B & b)
{
cout<<"B.age=="<<b.age<<endl;
}
class B;//第一步申明要申请友元的类(因为友元类中要用到它)
class A//第二部可以定义友元类(类中的友元成员函数除外,因为它要用到申请友元类的成员,而暂时申请友元的类并没有定义)
{
public:
A(){ cout<<"Run Constructor"<<endl;}
void test(){cout<<"Run test"<<endl;}
void print(const B & b);//申明类中友元成员函数,只是申明
};
class B//第三步定义要申请友元的类(在类中申明友元关系)
{
public:
B(int _age):age(_age){}
friend void A::print(const B & b);//申明友元关系
private:
int age;
};
//第四部定义友元成员函数
void A::print(const B & b)
{
cout<<"B.age=="<<b.age<<endl;
}