C++友元函数和友元类

本文详细介绍了C++中的友元概念,包括友元函数和友元类。友元函数可以访问类的私有和保护成员,不是类的成员但需要在类中声明。友元类则是整个类成为另一个类的友元,允许其访问所有成员。文章还讨论了友元关系的单向性、不可继承性以及友元重载,通过实例展示了友元在实际编程中的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

一、友元的概念

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

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qt历险记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值