C++——友元

友元

(一)概念

  友元分为友元函数友元类
  友元会增加耦合度,破坏了封装,所以应该尽量少用;

(二)友元函数

  1、声明与实现
  友元函数在类内声明,加friend关键字,在类外实现

class Data
{
     
public:
	friend ostream& operator<<(ostream& _cout, const Data& d);
private:
	int _year;
	int _month;
	int _day;
};
ostream& operator<<(ostream& _cout, const Data& d)
{
     
	_cout << _year << "-" << _month << "-" << _day;
	
	return _cout;
}

  2、友元函数的好处
  当我们想对输出流符号“<<”进行重载时,如果在将其写成非类成员函数,那么无法访问类的私有成员,而如果写成类的成员函数时:

class Data
{
     
	ostream& operator<<(ostream& _cout)
	{
     }
};

  我们会发现它的参数的位置就会颠倒,后面使用时就会出现很别扭的使用情况:

Data d;
d << cout;  //实际调用写法
cout << d;  //我们所希望的调用写法

  所以为了在调用的时候更加符合我们的习惯,就会将其定义为友元函数;
  3、注意

1、友元函数不是类的成员函数;
2、友元函数不能被const修饰;
3、一个函数可以是多个类的友元函数;

(三)友元类

class Time
	{
     
		friend class Data;  
	private:
		int _h;
		int _m;
		int _s;
	}

  Data是Time类的友元类,Data类中的所有成员函数可以访问Time类的私有成员,但是Time类不能访问Data类的私有成员;
  由此我们可以看出:友元关系是单向的, 且不能传递;
  当访问友元类的static成员时:必须通过对象或类来访问其友元类的static成员;

(四)内部类

  1、概念
  内部类就是在一个类的内部又定义了一个类;
  2、注意

1、内部类天然是外部类的友元类,可以访问外部类的所有成员;但是外部类不能访问内部类的私有成员;
2、计算外部类大小时,不包含内部类的成员;
3、内部类在创建对象:A::B b;
4、访问普通成员:通过对象访问;
5、访问静态成员:直接访问;

你可能感兴趣的:(C++)