1、普通函数做友员函数,为什么,什么场景?(<<运算符重载)
2、某个类的成员函数作为另一个类的友员函数?(如何使用)
3、友员类,有啥作用(声明后其成员都变为另一个类的友员)
3、友员函数是如何定义的 ? (声明名和定义)
4、友员函数是否可以继承? (基类和派生类)
5、一个类的成员函数是否可以作为另一个类的友员函数? (类A 和 类B,定义的先后顺序)
6、友员函数的优缺点,是否推荐使用?
1、
class A
{
private:
int x;
public:
A(int xx):x(xx){
}
friend void print(A &a);//声明友员
};
void print(A &a)
{
cout<<a.x<<endl;//在友员函数可以直接使用类对象的私有和保护数据
return;
}
2、
class B;//先声明这个类下面需要到
class A
{
private:
int x;
public:
A(int xx) :x(xx){}
void print(B &b);//B类的定义后面给出,前面已经提前给出了声明
};
class B
{
private:
int date;
public:
B(int bb) : date(bb){}
friend void A::print(B &b);//声明A的成员函数print为该类的友员,故在A类中可以直接使用B类对象的私有和保护数据
};
void A::print(B &b)//定义类的成员函数
{
cout << b.date << endl;//应为已经在B类中声明了该函数为友员函数,所以这里可以在A类中调用B类对象中的私有和保护成员
return;
}
int main()
{
A a(1);
B b(2);
a.print(b);
return 0;
}
3、
class B;//先声明这个类下面需要到
class A
{
private:
int x;
public:
A(int xx) :x(xx){}
friend class B; //这里声明了B类为友员类,那么就表示B是我的朋友,所以B你可以对我的对象的私有和保护成员有操作权限
};
class B
{
private:
int date;
public:
B(int bb) : date(bb){}
void print(A &a);
};
void B::print(A &a)//定义类的成员函数
{
cout << a.x << endl;//应为已经在A类中声明了B类是A类的朋友,所以这里可以在B类中调用A类对象中的私有和保护成员
return;
}
int main()
{
A a(1);
B b(2);
b.print(a);
return 0;
}
6、
尽量不使用友员函数
缺点:友员函数破坏了类的封装性,降低了类的可靠性和可维护性。
优点:可以更加高效的操作数据,有很高的灵活性,使得C的函数能更好的与C++的类结合,可以更加自然的使用c++的定义输入输出流<<的重载函数。