C++中的friend友元函数详细解析

让我来详细讲解一下“C++中的friend友元函数详细解析”的完整攻略。

什么是友元函数

在C++中,一个类的成员函数和成员变量通常只能被该类的对象使用。但是有些时候,我们需要在类外部的函数中使用该类的私有成员,这个时候可以使用友元函数。

友元函数是在类内部声明,在类外部定义的非成员函数,友元函数拥有访问该类的私有成员变量和私有成员函数的权限。友元函数可以在类外部调用,但是不能为空指针。

如何使用友元函数

要在一个类中声明友元函数,需要将其声明为该类的友元函数。友元函数需要在类中声明并定义,而不是声明在函数的原型中。

在声明友元函数时,需要在函数声明前加上friend关键字,例如:

class A {
  friend void fun();
};

该代码将声明一个名为fun的函数,并将其声明为类A的友元函数。

在类定义外部定义友元函数时,需要继续使用friend关键字,同时需要在函数名称前面加上类名称的作用域,例如:

class A {
  friend void ::fun(); // 注意这里的双冒号,表示使用全局命名空间中的函数fun()
};

示例一

下面是一个简单的示例,演示了如何在类中声明和使用友元函数:

#include <iostream>
using namespace std;

class Box {
  double width;
public:
  friend void setWidth(Box& box, double width);
  void printWidth() {
    cout << "Width of box : " << width << endl;
  }
};

void setWidth(Box& box, double width) {
  box.width = width;
}

int main() {
  Box box;

  // 通过友元函数设置宽度
  setWidth(box, 10.0);

  // 输出宽度
  box.printWidth();

  return 0;
}

在这个示例中,我们定义了一个叫做Box的类,并定义了一个名为setWidth的友元函数。在函数体内,我们可以访问Box类的私有成员width,并将其设置为传递给函数的值。在主函数中,我们创建了一个Box对象,并使用setWidth函数设置了它的宽度为10.0。然后我们调用了Box类中的一个成员函数printWidth()来打印对象的宽度。

示例二

下面是另一个示例,演示了如何使用类中的一个私有成员函数作为友元函数:

#include <iostream>
using namespace std;

class Box {
  double width;
  friend void printWidth(Box& box);
  void setWidth(double width) {
    this->width = width;
  }
public:
  void printWidth() {
    cout << "Width of box : " << width << endl;
  }
};

void printWidth(Box& box) {
  box.setWidth(10.0);
  cout << "Width of box : " << box.width << endl;
}

int main() {
  Box box;

  // 通过友元函数设置宽度
  printWidth(box);

  // 输出宽度
  box.printWidth();

  return 0;
}

在这个示例中,我们定义了一个叫做Box的类,并将printWidth()函数声明为Box类的友元函数。在printWidth()函数体内部,我们可以访问Box类中的一个私有成员函数setWidth(),并将其设置为传递给函数的值。在主函数中,我们创建了一个Box对象,并通过printWidth()函数来设置它的宽度,并打印出这个宽度。

总结

友元函数是C++中非常有用的特性,它允许类中的一个函数或外部函数访问类中的私有成员。在使用友元函数之前,需要先仔细考虑类的封装性,因为友元函数打破了类的隔离性。如果不慎使用不当,友元函数有可能会导致安全漏洞,所以需要谨慎使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的friend友元函数详细解析 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 使用vs2010编译log4cxx图文教程

    使用vs2010编译log4cxx图文教程: 步骤1:下载并解压log4cxx库 首先去Apache网站下载log4cxx的源码包,例如: https://downloads.apache.org/logging/log4cxx/0.11.0/apache-log4cxx-0.11.0.tar.gz 解压后得到一个apache-log4cxx-0.11.0的…

    C 2023年5月23日
    00
  • gin 获取post请求的json body操作

    获取post请求的json body操作指的是在网站的后端处理中,从请求中获取客户端使用POST方式提交的JSON数据。在Gin框架中,可以使用以下步骤来实现该操作。 1. 引入相关库 在Go中,可以使用标准库encoding/json来处理JSON数据。为了在Gin框架中方便处理JSON数据,需要引入github.com/gin-gonic/gin库。 i…

    C 2023年5月23日
    00
  • C语言中的睡眠理发师问题解决方案

    首先我们来介绍一下“C语言中的睡眠理发师问题”是什么。 “C语言中的睡眠理发师问题”是一个经典的操作系统并发问题,用于模拟多线程的同步、互斥等问题。问题可以描述为:在一个理发店中,有一个理发师和若干个等待理发的顾客。理发师和每位顾客都是一个独立的线程,理发师依次为每位等待的顾客理发,每位顾客进入理发椅前都需要等待理发师叫号。如果顾客到达时店里有顾客正在理发,…

    C 2023年5月9日
    00
  • C++11 thread多线程编程创建方式

    C++11 thread多线程编程是C++11新加入的多线程API,使用起来比较方便,可以在不同的线程中完成不同的任务,提高程序的运行效率。下面是C++11 thread多线程编程创建方式的完整攻略。 简介 C++11 thread多线程编程是在C++11标准中新增的多线程API。使用C++11 thread多线程编程可以实现线程的创建、销毁、同步等操作,提…

    C 2023年5月23日
    00
  • 深入理解C语言 static、extern与指针函数

    概述 在C语言中,static和extern是两个关键字,它们的作用主要与变量和函数的作用域和链接有关。而指针函数则是C语言中比较重要的一个概念,用于返回指针类型数据的函数。本文将从这三个方面进行详细讲解。 static关键字 static是一个非常常用的关键字,在C语言中主要有两个作用: 改变变量的作用域。当一个变量被定义为static时,它的作用域仅限于…

    C 2023年5月23日
    00
  • C语言实现飞机大战小游戏

    C语言实现飞机大战小游戏完整攻略 简介 飞机大战是一款经典的小游戏,它的玩法简单却精巧,是C语言初学者不错的练手项目。本文将详细介绍如何用C语言实现飞机大战小游戏。 准备工作 在开始编写游戏代码前,我们需要做一些准备工作: 安装开发环境(比如 Visual Studio Code,CodeBlocks 等等); 了解游戏窗口、控件绘制、键盘事件等基础知识。 …

    C 2023年5月22日
    00
  • C语言示例讲解if else语句的用法

    C语言示例讲解if else语句的用法 介绍与概述 在 C 语言中,if…else 语句是一种非常有用的逻辑结构,可以基于条件来控制程序流程的执行。它的基本语法如下所示: if (condition) { // 当条件为真时执行的代码 } else { // 当条件为假时执行的代码 } 其中,condition 是要进行判断的条件表达式,当条件表达式的值…

    C 2023年5月23日
    00
  • CCtalk中怎么领取C币 CCtalk领取C币教程

    CCtalk 中如何领取C币 概述 CCtalk是一个面向教育培训行业的在线教育平台,用户可以通过在平台上学习、交流等方式获取C币,用于购买学习资料、兑换虚拟商品等等。 领取C币的方式 CCtalk的C币可以通过以下方式获得: 系统赠送:在CCtalk平台注册、使用APP、参加活动等等情况下,会获得系统赠送的C币。 答题赢C币:在CCtalk中参加线上考试、…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部