类的友元函数:
/*
类的友元函数:
1、友元函声明在类中任何访问权限内
2、同一个对象,在main中不能访问私有,传入友元函数,就可以访问了
3、引用传递和值传递的实参,形式上是一样的
4、保护类型中的成员,友元函数也可以访问
5、友元函数中调用成员函数或者调用成员变量,都需要类对象
6、友元函数能够使用类中所有的成员,但是都需要使用类对象来调用
*/
#include<iostream>
using namespace std;
class demo{
public:
demo()
{
a = 0;
c = 0;
}
//friend void out_print(demo &did); //ok
void set_num(int num)
{
a = num;
}
void func1();
protected:
int c;
friend void out_print(demo &did);
void func2();
private:
int a;
void func3();
//friend void out_print(demo &did); //ok
};
//类成员函数初始化
void demo::func1(){
cout << "func1 in public" << endl;
}
void demo::func2(){
cout << "func2 in protected" << endl;
}
void demo::func3(){
cout << "func3 in private" << endl;
}
//引用传递和值传递一样都是把值作为实参传入
void out_print(demo &did)
{
cout << "func out_print" << endl;
cout << "did.a = " << did.a << endl; //ok
//友元函数也可以访问类的保护类型
cout << "did.c = " << did.c << endl;
did.c = 500;
cout << "did.c = " << did.c << endl;
/*友元函数调用成员函数*/
//func2(); error 友元函数中调用成员函数或者调用成员变量,都需要类对象来调用
did.func1(); //ok
did.func2(); //ok
did.func3(); //ok
}
int main()
{
demo did;
//cout << "main did.a = " << did.a << endl; error 同一个对象,在main中不能访问私有,传入友元函数,就可以访问了
cout << "sed num of class demo" << endl;
did.set_num(250);
cout << "start to friend func" << endl;
out_print(did);
return 0;
}