关于C++友元函数的实现讲解

关于C++友元函数的实现讲解

C++中的友元函数能够访问一个类的私有成员和保护成员,但不属于该类,也不是该类的成员函数,需要在类定义之外单独进行声明和定义。

友元函数的声明

友元函数的声明需在类的定义之外进行,并在函数名之前加上friend关键字。示例代码如下:

class A {
    friend void B::function(A&);
}

在上述代码中,类A声明了一个名为B的类的成员函数function为其友元函数。

友元函数的定义

友元函数的定义应放在函数名及参数之后,使用::运算符指明归属的类名。示例代码如下:

class B {
public:
    void function(A&);
};

void B::function(A& a) {
    // 在函数中可以访问A的私有成员和保护成员
}

在上述代码中,类B定义了一个名为function的成员函数,并在函数定义之前使用friend关键字声明类A的一个参数为A&类型的成员函数function为其友元函数。在函数定义中可以访问A的私有成员和保护成员。

示例1

class B;

class A {
    int a;
public:
    A(int a) : a(a) {}
    friend void B::changeA(A&, int);
};

class B {
public:
    void changeA(A& obj, int value) {
        obj.a = value;
    }
};

int main() {
    A obj(1);
    B b;
    b.changeA(obj, 2); // 调用B类的友元函数修改A类的私有成员
    return 0;
}

示例1中,类A的私有成员a被友元函数B::changeA访问并修改。在类A声明友元函数时,需要在类定义之前声明类B,因为成员函数(包括友元函数)在定义时需要访问其归属类的定义。

示例2

class Complex;

class Real {
    double val;
public:
    Real(double val) : val(val) {}
    friend Real operator+(Real&, Complex&);
    friend Real operator-(Real&, Complex&);
};

class Complex {
    double real, imag;
public:
    Complex(double real, double imag) : real(real), imag(imag) {}
    friend Real operator+(Real&, Complex&);
    friend Real operator-(Real&, Complex&);
};

Real operator+(Real& r, Complex& c) {
    return Real(r.val + c.real);
}

Real operator-(Real& r, Complex& c) {
    return Real(r.val - c.real);
}

int main() {
    Real r(2);
    Complex c(1, 2);
    // 调用友元函数重载实现Real和Complex的运算
    Real result1 = r + c;
    Real result2 = r - c;
    return 0;
}

示例2中,定义了一个名为Complex的类,以及一个名为Real的类,并重载了名为+-的运算符以实现Real和Complex的运算。在上述代码中,Real类和Complex类中的+-运算符函数被定义为Real类的友元函数,使得Real类和Complex类之间可以进行运算。在main函数中通过调用友元函数重载实现Real和Complex的运算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于C++友元函数的实现讲解 - Python技术站

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

相关文章

  • linux下基于C语言的信号编程实例

    下面我将为你详细讲解“linux下基于C语言的信号编程实例”的完整攻略。 概述 在linux系统中,信号机制是进程间通信的一种方式,它能够及时地通知进程事件的发生,从而使得进程能够立即做出响应。C语言提供了一系列的信号处理函数,可以用来处理不同种类的信号。在本攻略中,我们将实现两个基于信号机制的C语言程序,分别是捕获Ctrl+C信号和定时器信号。 程序一:捕…

    C 2023年5月22日
    00
  • JavaScript对象拷贝与Object.assign用法实例分析

    JavaScript对象拷贝与Object.assign用法实例分析 在JavaScript编程中,对象拷贝是一项非常重要的任务,因为我们经常需要在代码中使用对象,但由于JavaScript对象的引用特性,往往原始对象会被误修改或者无意间影响其他部分代码,这时候需要做对象拷贝,保持数据的安全完整性。JavaScript的标准库提供了多种深复制或浅复制对象的拷…

    C 2023年5月22日
    00
  • C语言中.与->的用法介绍

    下面是C语言中.与->的用法介绍的完整攻略。 什么是.和-> .和->都是C语言中的运算符,用来访问结构体中的成员。 .运算符是用来访问结构体变量中的成员的,而->运算符是用来访问结构体指针变量(或者类指针变量)中的成员的。 .的用法 .运算符基本语法如下所示: 结构体变量名.成员名; 其中,结构体变量名是结构体类型的变量名,成员名是…

    C 2023年5月22日
    00
  • C++使struct对象拥有可变大小的数组(详解)

    下面是详细的攻略: 标题 C++使struct对象拥有可变大小的数组(详解) 概述 C++中struct是一个非常常用的数据结构,它可以用来封装数据变量和函数的集合。在实际开发中,经常需要在struct中使用一个动态大小的数组,C++提供了几种实现方法。本文将详细讲解C++如何使struct对象拥有可变大小的数组。 使用std::vector std::ve…

    C 2023年5月22日
    00
  • C语言实现简单翻译功能

    C语言是一种非常流行的计算机编程语言,可以通过编写C语言程序实现各种功能,包括翻译。下面,我将详细讲解如何使用C语言实现简单翻译功能的完整攻略。 1. 确定翻译的语言和范围 要使用C语言实现翻译功能,首先需要确定翻译的语言和范围。目前,市面上的翻译API有很多,涵盖了多种语言和领域,例如百度翻译、谷歌翻译等。我们可以根据具体需求选择合适的翻译API。 2. …

    C 2023年5月23日
    00
  • 用C++实现队列的程序代码

    实现队列的程序代码主要涉及以下内容:数据结构、队列的操作、C++语法等。下面我们一步步来进行讲解。 数据结构 队列可以看成是一种特殊的线性表,它具有先进先出(FIFO)的特点,即先进队列的元素将先输出,后进队列的元素将后输出。 队列通常包含以下几个基本操作:入队、出队、判空和求队列长度等。入队就是将新元素插入到队列的末尾,出队就是将队头元素删除并返回,判空就…

    C 2023年5月23日
    00
  • C 函数

    C 函数的完整使用攻略 在 C 语言中,函数是一个重要的概念。函数可以将代码分为模块化的单元,使得程序更加易于维护和重构。下面我们将讲解如何完整地使用 C 函数。 函数的结构 C 语言的函数通常由以下部分组成: 返回类型 函数名(参数1类型 参数1名, 参数2类型 参数2名, …) { 函数体 return 返回值; } 返回类型:指定函数的返回值类型。…

    C 2023年5月10日
    00
  • 浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)

    不过为了更好地描述,需要一些背景知识。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它与JavaScript中的对象字面量非常相似。JSON格式的数据被广泛应用于前后端数据传输和存储,其易读性和易解析性非常高。在使用JavaScript进行前端开发时,字符串与JSON格式之间的转换是常见的需求之一。 示例1: …

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