首页 > 编程语言 >面向对象 程序分析 友元函数

面向对象 程序分析 友元函数

时间:2023-04-11 10:47:28浏览次数:32  
标签:友元 函数 int 成员 面向对象 MyClass Myclass

什么是友元函数?

友元函数(friend function)是C++中一个特殊的函数类型。它不是类的成员函数,但它可以访问类的私有(private)和保护(protected)成员。友元函数提供了一种突破类封装的机制,允许在类之外的代码访问类的私有和保护成员。

当你想要让某个函数访问一个类的私有和保护成员时,可以将这个函数声明为类的友元。在类定义中,你需要使用friend关键字来声明友元函数。友元函数可以是普通的非成员函数,也可以是另一个类的成员函数。

请注意,滥用友元函数会破坏封装和数据隐藏,可能导致程序设计上的问题。因此,在实际编程中,应谨慎使用友元函数。

#include <iostream>
using namespace std;

class MyClass {
private:
    int secretValue;

public:
    MyClass(int value) : secretValue(value) {}
    friend void revealSecret(const MyClass& obj);
};

// 声明为MyClass类的友元的非成员函数
void revealSecret(const MyClass& obj) {
    cout << "The secret value is: " << obj.secretValue << endl;
}

int main() {
    MyClass obj(42);
    revealSecret(obj);  // 调用友元函数,访问并输出MyClass类的私有成员secretValue
    return 0;
}

在这个例子中,revealSecret函数被声明为MyClass类的友元函数,它可以访问类的私有成员变量secretValue。当我们在main函数中创建一个MyClass对象并调用revealSecret函数时,revealSecret函数可以访问并输出对象的私有成员。

   

 

例36:

#include <iostream>
using namespace std;

class Myclass {
private:
    int a, b, max, min;

public:
    Myclass(int i, int j): a(i), b(j) {
        max = (a > b) ? a : b;
        min = (a < b) ? a : b;
    }
    friend int Result(Myclass & x);
};

int Result(Myclass& x) {
    return x.max * x.max - x.min * x.min;
}

int main() {
    Myclass n(3, 4);
    cout << Result(n) << endl;
}

 

  1. 引入<iostream>头文件,包含C++的标准输入输出库。
  2. 定义了一个名为Myclass的类。它包含四个私有成员变量:a, b, max, min。
  3. Myclass类有一个构造函数,接受两个整数参数i和j,分别赋值给成员变量a和b。在构造函数中,使用三元运算符计算a和b之间的最大值和最小值,分别存储在max和min成员变量中。
  4. 在Myclass类中,声明了一个友元函数Result()。友元函数是不属于类的成员函数,但它可以访问类的私有成员。这里,Result()函数被声明为Myclass类的友元,因此它可以访问类的私有成员变量。
  5. 定义Result()函数。它接受一个Myclass类的引用作为参数,并返回一个整数。在这个函数中,通过引用参数x访问到Myclass类的max和min成员变量,计算并返回它们的差值(最大值平方减最小值平方)。
  6. 在main()函数中,创建了一个Myclass类的对象n,传入参数3和4。然后调用Result()函数并将结果输出到控制台。

程序的输出将是:(4 * 4) - (3 * 3) = 16 - 9 = 7

 

标签:友元,函数,int,成员,面向对象,MyClass,Myclass
From: https://www.cnblogs.com/eric-fox/p/17305396.html

相关文章

  • vue生命周期(钩子函数)
    目录介绍介绍Vue实例有一个完整的生命周期,也就是从开始创建初女台化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。生命周期:vue实例从创建到销毁的过程。生命周期钩子:就是生命周期事件的别名而已钩子函数描述创建期间的......
  • 函数中可变参数的应用
    背景在函数或类定义中传入的参数是可变参数,常见的是字典、列表、数组(ndarray),函数内容如果仅仅是引用该这些对象没有什么大问题。但是如果涉及增、删操作,将会发生非常诡异的事情。下面以《流畅的Python》中定义的一个案例进行介绍:classHauntedBus:def__init__(self,p......
  • MySQL函数
    HEX[[email protected]][test]>select16,HEX(16);+----+---------+|16|HEX(16)|+----+---------+|16|10|+----+---------+1rowinset(0.00sec) CAST[[email protected]][test]>createtabletest_col_sort(userchar(10),typeenum(�......
  • 10-面向对象综合训练综合练习
    练习一:文字版格斗游戏需求:​ 格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。举例:​ 程序运行之后结果为:​ 姓名为:乔峰 血量为:100​ 姓名为:鸠摩智 血量为:100​ 乔峰举起拳头打了鸠摩智一下,造成了XX点伤害,鸠摩智还剩......
  • Context响应,重定向,自定义函数,Abort
    前言:Context对象提供了很多内置的响应形式,JSON、HTML、Protobuf、MsgPack、Yaml、String等。它会为每一种形式都单独定制一个渲染器。Context是Gin最重要的部分。它允许我们在中间件之间传递变量,管理流程,验证请求的JSON并呈现JSON响应。正文: content响应字符串,json,及......
  • 57、K8S-监控机制-Prometheus-PromQL基础-运算符、聚合、功能函数
    Kubernetes学习目录1、数据基础1.1、时间序列1.1.1、介绍时间序列数据:按照时间顺序记录系统、设备状态变化的数据,每个数据称为一个样本;数据采集以特定的时间周期进行,因而,随着时间流逝,将这些样本数据记录下来,将生成一个离散的样本数据序列;该序列也称为向量(Vector);而将多个序......
  • 视图,触发器,事务,存储过程,内置函数,流程控制,索引
    目录SQL注入问题视图1、什么是视图2、为什么要用视图3、如何用视图触发器为何要用触发器创建触发器语法事务(掌握)什么是事务事务的作用事务的4个属性(ACID)如何用存储过程基本使用三种开发模型第一种第二种第三种创建存储过程如何用存储过程函数流程控制索引b+树聚集索引(primaryk......
  • 定义一个基类Base,有两个公有成员函数fn1,fn2,私有派生出Derived类,如何通过Derived类
    定义一个基类Base,有两个公有成员函数fn1,fn2,私有派生出Derived类,如何通过Derived类的对象调用基类的函数fn1。#include<bits/stdc++.h>usingnamespacestd;classBase{public: intfn1(){return0;} intfn2(){return0;}};classDerived:privateBase{publi......
  • 定义一个基类Object,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员hei
    定义一个基类Object,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数与析构函数的调用顺序。#include<bits/stdc++.h>usingnamespacestd;classObject{protected: doubleweight;public: Object(......
  • 借用gcc内置函数帮助C来实现函数重载
    借用gcc内置函数__builtin_choose_expr和__builtin_types_compatible_p可以帮助c来实现函数重载。首先对这两个函数功能做下介绍__builtin_choose_expr(expr,expr1,expr2)与c语言:?运算符有些类似,如果expr表达式为真,那么返回expr1,否则返回expr2_builtin_types_compatible_p(ty......