一、友元的概念
1. 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保(protected)成员。 尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。 在类中不占用空间
2.友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
二、友元函数的关键字介绍
声明关键字:friend
参数:
main主函数:对象名 prinwidth( yyds );
函数定义:类名 + 对象名 void prinwidth(YYDS yyds)
3.由于不是类成员,所以没有this指针功能:
要访问非static成员时,需要对象做参数; 要访问static成员或全局变量时,则不需要对象做参数;如果做参数的对象是全局对象,则不需要对象做参数.
可以直接调用友元函数,不需要通过对象或指针
4.代码加深印象
#include <iostream>
using namespace std;
class YYDS
{
double weidth; //默认私有
public:
double length;
friend void prinwidth(double w ,YYDS yyds);
void setWidth(double wid);
};
//成员函数定义
void YYDS::setWidth(double wid)
{
weidth =wid; //赋值
printf("类成员函数赋值%.4lf\n",weidth);
}
//prinwidth不是任何类的成员函数(友元函数)
//把他声明在这个类内,即可访问全部成员
void prinwidth(double w, YYDS yyds)
{
//友元函数可以访问类的任何成员
yyds.weidth = w;
cout<<"友元函数赋值:"<<yyds.weidth<<endl;
//没有this功能
}
int main(int argc, char *argv[])
{
//创建栈对象
YYDS yyds; //友元函数的参数就是这段,所以他可以访问这个类的任何成员函数和变量
yyds.setWidth(10.0);
//使用友元函数输出宽度
prinwidth(12.0000 ,yyds ); //参数是类对象
return 0;
}
结果:
PS C:\Users\newuser\Desktop\C++\第五天C++> g++ .\Y友
元函数.cpp
PS C:\Users\newuser\Desktop\C++\第五天C++> ./a
类成员函数赋值10.0000
友元函数赋值:12
三、友元类介绍
将一个类设置另一个类的友元,格式:
class A
{
private:
int age;
// 将B设置A的友元
friend class B; //注意顺序,不然会报错
}
class B
{
}
3.1友元类总结:
友元是单向的,比如将A类声明为B类的友元类,那么A类可以访问B类的所有成员 但是,B类不能访问A类的私有或保护成员 设置为友元类后,此类任意方法可以访问另一个类的所有属性
3.2友元类不能继承
基类的友元函数不能被派生类继承。**但是当派生类是通过公有继承方式派生时,默认地通过强制类型转换,可以将派生类转换为基类,从而调用友元函数。**证明了派生类与基类是
is -a 的关系。但是,如果派生类是通过私有继承时,则不能够调用基类的友元函数。友元类不能访问子类 //C++三态:封装 继承 多态
3.3 友元关系不能继承
1.基类的友元对派生类的成员没有特殊访问权限。
2.如果基类被授予友元,则只有基类具有特殊访问权限,该基类的派生类无特殊访问权限;
3.但该基类没有被派生类重写且有特殊访问的成员函数仍能被派生类对象直接调用。
3.4.友元重载
friend operator 重载符(参数1,参数2)
规定 : 加号左值为第一个参数(参数1) 加号右值为第二个参数(参数2)
对象+号重载代码
#include <iostream>
#include <cmath>
using namespace std;
class AA
{
public:
AA(int a, int b):x(a),y(b){}
friend AA operator+ (AA &a, AA &b);
int x;
int y;
};
AA operator+ (AA &a,AA &b)
{
AA ppt(0,0); //创建零时对象,初始化
ppt.x=a.x+b.x;
ppt.y=a.y+b.y;
return ppt;
}
int main(int argc, char const *argv[])
{
AA st(20,90);
AA tt(11,13);
AA ppt = st + tt; //两个对象相加,ppt接收临时对象返回值
cout<<"ppt_x="<<ppt.x<<endl;
cout<<"ppt_y="<<ppt.y<<endl;
return 0;
}
结果
20+11
90+13
PS C:\Users\newuser\Desktop\C++\第
八天C++> g++ .\友元重载.cpp
PS C:\Users\newuser\Desktop\C++\第
八天C++> ./a
ppt_x=31
ppt_y=103