用friend修饰的函数
普通友元函数~友元只是提供一个场所,赋予对象能够打破类的权限限定(无视权限)
~不是说可以忽视掉原来的规则,类中的数据成员必须通过对象去调用
~友元函数在一定程度上打破了类的封装性
小知识:
友元函数可以在类中声明,类中实现/类外实现
在类外实现友元函数需要注意:
~不需要类名限定
~不需要friend关键字
无参普通函数:在类中声明,在类中实现需要在最前面声明一下<--->未声明--->未定义的标识符
void printData(); //告诉编译器有这个函数,函数在类中的定义实现
友元函数不属于类,在类中实现不能直接访问数据
解决方案
--->在友元函数中构造的对象可以无视权限--->访问保护、私有属性
class Student
{
public:
Student(string name, int age) :name(name), age(age) {}
friend void printdata() {
Student gg("好朋友",29); //在友元函数中构造一个对象
cout <
--->传参的方式
class Student
{
public:
Student(string name, int age) :name(name), age(age) {}
friend void printdata(Student&mm) {
cout << mm.name << "t" << mm.age << endl;
}
protected:
string name;
int age;
};
int main()
{
Student mm("小明", 18);
printdata(mm);
return 0;
}
注意:普通函数和友元函数的区别
普通函数没法直接调用,需要类名限定,存在权限限定问题
友元函数不受权限限定,在外面可以直接调用
void printData(Student& mm)
{
cout<
以另一个类的成员函数充当友元函数
一个类的成员函数成为另一个类的友元函数,实现顺序如下:
-
B 类
-
A类
-
A类的友元函数(B类的成员函数)--->成员函数的实现一定是在另一个类(A类)的下面实现
比喻:有一个人,再来一个人,才能描述他们之间的关系
class B
{
public:
void printA();
};
class A
{
public:
friend void B::printA(); //把B类的成员函数充当A类的友元函数
protected:
string name= "A";
};
void B::printA()
{
A a;
cout << a.name<< endl;
}
int main()
{
B b;
b.printA();
return 0;
}
小知识:在B类中的其他函数<--->不是A类的友元函数,不能无视权限限定
class B{
void printData();
};
void B::print(){ //B类的一个成员函数(未声明为A类的友元函数)
A a;
cout << a.name<< endl; //报错,不能访问,没有 声明为A类/不是A类 的友元函数
} 


