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日

相关文章

  • Redhat 6.2 下 oracle 11g R2的安装详解第2/2页

    让我来详细讲解 “Redhat 6.2 下 oracle 11g R2的安装详解第2/2页” 的完整攻略。 前言 安装 Oracle 数据库是一个比较复杂的过程,需要仔细阅读并按照官方文档或者其他详细攻略一步一步操作。本攻略是基于 Redhat 6.2 系统,讲解 Oracle 11g R2 的安装步骤。 步骤 准备环境 在安装 Oracle 之前,需要安装…

    C 2023年5月23日
    00
  • C语言利用system调用系统命令行详情

    C语言可以利用system()函数来调用系统命令行。一般情况下,system()函数会启动一个新的进程来执行传入的命令,然后等待该进程结束后返回。在使用system()函数时,需要先包含头文件<stdlib.h>。 函数原型 int system(const char *command); 参数说明 command:需要执行的命令字符串,可以是系…

    C 2023年5月23日
    00
  • C语言文件操作详解以及详细步骤

    C语言文件操作详解以及详细步骤 在C语言中,文件操作是非常常见且必要的,本文将为您详细介绍C语言文件操作的相关知识。 打开文件 要打开一个文件,必须首先创建一个指向该文件的文件指针,并使用C语言标准库函数fopen()来打开该文件。fopen()函数的原型如下: FILE *fopen(const char *filename, const char *mo…

    C 2023年5月23日
    00
  • C语言实现班级成绩管理系统

    C语言实现班级成绩管理系统 系统设计 班级成绩管理系统需要实现的功能包括学生信息的录入、成绩的录入、成绩的查询等,因此我们需要设计以下的数据结构: 学生信息 我们需要记录每个学生的学号、姓名和班级信息,因此我们可以使用如下的结构体定义: typedef struct student { char id[20]; char name[20]; char cla…

    C 2023年5月23日
    00
  • 深入理解c语言数组

    深入理解C语言数组 什么是数组 数组是一种数据结构,它是由相同类型的元素所组成的序列。 在C语言中,数组是由相同类型的元素在内存中连续存储所组成的。数组的下标是从0开始的非负整数,用于访问数组中的元素。数组的大小是在声明时指定的,一旦确定大小就不能改变。 数组的声明 C语言数组的声明格式如下: type arrayName[arraySize]; 其中,ty…

    C 2023年5月24日
    00
  • C++ set到底是什么

    C++的set是一个标准库中的容器,提供了有序关联容器的功能。一个set中的元素是按照特定的顺序排列的,并且每个元素只能在set中出现一次,而且这个元素的值可以作为关键字来使用。下面我们将详细介绍set的主要功能和应用。 1. set的定义和基本操作 定义一个set 定义一个set需要包含头文件<set>,同时set是一个泛型类,可以为任意类型定…

    C 2023年5月23日
    00
  • C++语言const 关键字使用方法图文详解

    C++语言const 关键字使用方法图文详解 什么是const const关键字是C++语言中的保留关键字,用于修饰变量,表示在程序运行过程中该变量的值不能被修改。const关键字的使用可以提高程序的可读性和安全性。 如何使用const const修饰变量 const int a = 10; 上述代码中,变量a被定义为const类型,表示该变量的值为10,在…

    C 2023年5月22日
    00
  • win10环境下C++ vs2015编译opencv249的教程

    以下是“win10环境下C++ vs2015编译opencv249的教程”的完整攻略。 准备工作 下载安装 VS2015 首先,需要下载并安装 Visual Studio 2015,可以通过微软官网下载,或者通过电脑管家等软件下载。 下载安装 CMake 其次,需要下载并安装 CMake。同样可以通过官网下载。 下载安装 Opencv 2.4.9 最后,需要…

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