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

阅读剩余 58%

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

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

相关文章

  • C程序 显示两个区间的阿姆斯特朗数字

    下面我将为你详细讲解“C程序 显示两个区间的阿姆斯特朗数字”的完整使用攻略。 一、程序介绍 这个C程序可以用来显示两个区间之间的阿姆斯特朗数字。阿姆斯特朗数是指一个n位数各位数字的n次幂之和等于该数本身(例如,153是一个阿姆斯特朗数,因为1^3 + 5^3 + 3^3 = 153)。 二、程序使用攻略 下面是使用该程序的步骤: 1. 下载并打开程序 该程序…

    C 2023年5月9日
    00
  • 微软Surface Laptop 4怎么样 微软Surface Laptop 4详细评测

    微软Surface Laptop 4怎么样 微软Surface Laptop 4详细评测 微软Surface Laptop 4于2021年4月13日发布,作为Surface Laptop系列的第四代产品,定位在轻薄便携的高性能笔记本市场。下面我们详细评测一下这款产品。 设计与外观 微软Surface Laptop 4有两种尺寸可选,分别是13.5英寸和15英…

    C 2023年5月23日
    00
  • C#解析json文件的实现代码

    让我为你详细讲解一下“C#解析json文件的实现代码”的完整攻略。 什么是 JSON? 首先,我们需要了解一下 JSON 是什么。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于理解和编写。它基于 JavaScript Programming Language, Standard ECMA-262 3rd Ed…

    C 2023年5月23日
    00
  • Ubuntu安装Jupyter Notebook教程

    下面是Ubuntu安装Jupyter Notebook的完整攻略: 安装Jupyter Notebook: 首先,在终端中执行以下命令来更新系统: bash sudo apt-get update 然后,可以通过以下命令来安装Python和pip: bash sudo apt-get install python3 python3-pip 在Python3中…

    C 2023年5月22日
    00
  • OpenMP深入剖析reduction子句教程

    《OpenMP深入剖析reduction子句教程》是一篇介绍OpenMP并行编程中的reduction子句的文章,在这篇文章中,笔者为大家详细讲解了reduction子句的常用用法、编写注意事项、性能优化技巧等。 下面是详细的攻略: 标题 OpenMP深入剖析reduction子句教程 介绍 OpenMP是一套并行编程API,用于编写多线程程序。其中的red…

    C 2023年5月23日
    00
  • C语言return, exit, abort的区别

    C语言中return, exit, abort都是用来结束程序的函数,但是它们有一些区别。 return return语句是用来返回函数的返回值,并将函数的执行权交给调用者。如果在main函数中使用return语句,则相当于结束程序。return语句的作用范围仅限于函数内部,即return只能在函数中使用。 以下是return的示例代码: #include …

    C 2023年5月23日
    00
  • C++ 中私有继承的作用

    C++ 中的私有继承是一种继承方式,它可以让派生类的对象获得基类的成员,但是这些成员只能在派生类内部访问,从而实现了封装。私有继承的作用有以下几点: 实现代码复用 私有继承可以实现代码的复用。比如有一个基类 Person,其中定义了一些通用的成员变量和函数,而派生类 Teacher 和 Student 都需要使用这些成员。此时可以通过私有继承来避免代码重复。…

    C 2023年5月22日
    00
  • Maplesoft Maple 2020官方正式版安装教程图文详细介绍(含下载地址)

    Maplesoft Maple 2020正式版安装教程 本文介绍了Maplesoft Maple 2020正式版的安装方法,包括下载和安装过程。 下载Maple软件 官网下载链接:https://www.maplesoft.com/support/downloads/ 访问上述链接,找到Maple软件的下载链接,选择合适的版本下载。 下载完成后双击安装包,开…

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