
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
C++ 友元
前言
提示:这里可以添加本文要记录的大概内容:
本人是一个大一萌新,之间有什么不足或bug欢迎各路大佬批评指正!!!也欢迎大家共同学习,共同进步!!!
提示:以下是本篇文章正文内容,下面案例可供参考
友元函数在类的作用域之外被定义,不是类的成员函数,但具有访问类的public private protected成员的成员权限.
二、友元函数声明的一般形式:// friend <返回类型> <函数名> (<参数列表>);
// 在类定义中函数原型前加friend 就将函数声明为该类的友元.
// 声明这个友元函数可以在类的任何地方,可以访问友元函数的所有成员,所有成员函数;
``
// 例如:
#include
using namespace std;
class MyClass
{
public :
MyClass(string name)
{
m_name = name;
}
friend void Display(MyClass &mycalss); // 友元函数
protected:
string m_name;
};
void Display(MyClass &mycalss)
{
cout << "Access Protected data : " << mycalss.m_name << endl;
} // 此时访问了Myclass的protected变量
int main()
{
MyClass test("Class A");
Display(test);
return 0;
}
友元函数的使用:
1.一个普通函数可以是多个函数的友元:
#include
using namespace std;
class MyClass_B;
class MyClass_A
{
public :
MyClass_A(string name)
{
m_name = name;
}
friend void Display(MyClass_A &myA,MyClass_B &myB);
private :
string m_name;
};
class MyClass_B
{
public :
MyClass_B(string name)
{
m_name = name;
}
friend void Display(MyClass_A &myA,MyClass_B &myB);
private :
string m_name;
};
void Display(MyClass_A &myA,MyClass_B &myB)
{
cout << "MyClass A : " << myA.m_name << endl;
cout << "MyClass B : " << myB.m_name << endl;
}
int main()
{
MyClass_A testA("Class A");
MyClass_B testB("Class B");
Display(testA,testB);
return 0;
}
2一个类的成员函数也可以是另一个类的友元:
#include
using namespace std;
class MyClass_B;
class MyClass_A
{
public :
MyClass_A(string name)
{
m_name = name;
}
void Function(MyClass_B &myB);
private :
string m_name;
};
class MyClass_B
{
public :
MyClass_B(string name)
{
m_name = name;
}
friend void MyClass_A::Function(MyClass_B &myB);
private :
string m_name;
};
void MyClass_A::Function(MyClass_B &myB)
{
cout << myB.m_name << endl;
}
int main()
{
MyClass_A testA("Class A");
MyClass_B testB("Class B");
testA.Function(testB);
return 0;
}
3.整个类也可以是另一个类的友元:
#include
using namespace std;
class MyClass_B;
class MyClass_A
{
public :
MyClass_A(string name)
{
m_name = name;
}
friend class MyClass_B;
private :
string m_name;
};
class MyClass_B
{
public :
MyClass_B(string name)
{
m_name = name;
}
void Display(MyClass_A &myA);
private :
string m_name;
};
void MyClass_B::Display(MyClass_A &myA)
{
cout << myA.m_name << endl;
MyClass_A test("test");
cout << test.m_name << endl;
}
int main()
{
MyClass_A testA("Class A");
MyClass_B testB("Class B");
testB.Display(testA);
return 0;
}
总结:
- 即使frinend函数的原型出现在类定义内,友元仍不是成员函数.
- private、protected、public这些成员访问说明符标志与友元的声明无关,也就是说友元可以定义在类的任何地方.
- 友元关系是授予关系,而不是索取.也就是说,要使类B成为类A的友元,类A必须在类中显式的声明类B是它的友元.
- 友元既不对称也不传递: 类A是类B的友元,类B是类C的友元,不能说明类B是类A的友元,类C是类B的友元,类A是类C的友元.怎么理解呢? 咱们把ABC当成三个人,A说B是我的朋友,B说C是我的朋友,但是B不一定承认A是它的朋友,所以B可以访问A的成员,但A不能访问的成员,同理BC也是. A说B是我的朋友,B说C是我的朋友也不能说明A是C的朋友.
以上就是今天要讲的内容,如有什么不足欢迎大家批评改正!!!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)