首页 > 其他分享 >友元函数friend

友元函数friend

时间:2024-10-10 19:51:12浏览次数:9  
标签:友元 函数 int 成员 MyClass void friend

在C++中,友元函数(Friend Function)是一种特殊类型的函数,它不属于类的成员函数,但可以访问类的私有成员和保护成员。友元函数可以是普通函数、其他类的成员函数或类的成员函数模板。下面是关于C++友元函数的一些关键知识点:

  1. 定义友元函数
    友元函数的声明需要在类的内部进行,使用关键字 friend。函数的具体定义则可以在类的外部进行。
class MyClass {  
private:  
    int privateVar;  
  
public:  
    MyClass(int val) : privateVar(val) {}  
  
    // 声明友元函数  
    friend void friendFunction(MyClass &obj);  
};  
  
// 定义友元函数  
void friendFunction(MyClass &obj) {  
    // 可以访问MyClass的私有成员  
    std::cout << "Private Variable: " << obj.privateVar << std::endl;  
}
  1. 友元函数的特点
    访问权限:友元函数可以访问类的私有成员和保护成员,但不能访问公有成员(虽然公有成员本身可以通过对象直接访问)。
    非成员函数:友元函数不是类的成员函数,因此它没有 this 指针,也不受类的约束(如访问控制)。
    不继承:友元关系不是继承的,即一个类的友元函数不会自动成为其派生类的友元函数。
  2. 友元函数与其他类的关系
    一个类的友元函数可以访问另一个类的私有成员。
cpp
class ClassA {  
private:  
    int valueA;  
  
public:  
    ClassA(int val) : valueA(val) {}  
  
    // 声明ClassB的成员函数为友元  
    friend void ClassB::display(ClassA &obj);  
};  
  
class ClassB {  
public:  
    void display(ClassA &obj) {  
        // 可以访问ClassA的私有成员  
        std::cout << "ValueA: " << obj.valueA << std::endl;  
    }  
};
  1. 友元成员函数
    一个类的成员函数可以声明为另一个类的友元函数。这允许它访问另一个类的私有成员。
class Engine {  
private:  
    int power;  
  
public:  
    Engine(int p) : power(p) {}  
  
    // 声明另一个类的成员函数为友元  
    friend void Car::showEnginePower(Engine &e);  
};  
  
class Car {  
public:  
    void showEnginePower(Engine &e) {  
        // 可以访问Engine的私有成员  
        std::cout << "Engine Power: " << e.power << std::endl;  
    }  
};
  1. 友元函数模板
    友元函数也可以是模板函数。
class MyClass {  
private:  
    int data;  
  
public:  
    MyClass(int val) : data(val) {}  
  
    // 声明模板友元函数  
    template <typename T>  
    friend void printData(MyClass &obj, T value);  
};  
// 定义模板友元函数  
template <typename T>  
void printData(MyClass &obj, T value) {  
    std::cout << "Data: " << obj.data << ", Value: " << value << std::endl;  
}
  1. 使用注意事项
    适度使用:友元函数破坏了类的封装性,应谨慎使用,避免滥用。
    避免复杂依赖:过度使用友元函数可能会导致类之间的依赖关系复杂,增加代码的维护难度。
    友元函数是C++中一种灵活但具有一定风险的特性,适用于需要在某些情况下打破封装访问私有成员的情景。通过合理使用,可以在不破坏封装的前提下,实现某些特定的功能需求。

标签:友元,函数,int,成员,MyClass,void,friend
From: https://blog.csdn.net/Bulling_/article/details/142830127

相关文章

  • 【玩转 JS 函数式编程_010】3.2 JS 函数式编程筑基之:以函数式编程的方式活用函数(上)
    写在前面按照惯例,过长的篇幅分开介绍,本篇为JavaScript函数式编程核心基础的第二部分——以函数式编程的方式活用函数的上篇,分别介绍了JS函数在排序、回调、Promise期约、以及连续传递等应用场景下的用法演示。和之前章节相比难度又有一定的提升。准备好了吗?3.2.以......
  • 简明逻辑回归中的Sigmoid函数
    Sigmoid函数简介Sigmoid函数是一种常用的激活函数,其定义为: ​这个函数将任意实数值映射到0和1之间,因此特别适合用于二分类问题,输出可以被解释为概率。Sigmoid函数的特性范围:Sigmoid函数的输出值在(0,1)之间。单调性:随着输入 x的增加,输出值单调递增。中心对称:在 x=0......
  • ctype.h系列的字符函数
    C中有一系列专门处理字符的函数,ctype.h头文件中包含了这些函数的原型。这些函数接收一个字符作为参数,如果该字符属于某特殊的类别,就返回一个非0值(真),反之,返回一个0(假)。                                        ......
  • 简单理解pandas的groupby函数
    pandas中的groupby函数,可以对数据进行分组,然后对分组后的数据进行聚合操作,比如求和、平均值、最大值、最小值等。平时使用groupby处理后,通常使用aggregate函数进行聚合操作。其实,groupby分组之后的聚合操作方法还很多,具体可以参考官方文档。1.读取数据dataframe=pd.DataFrame({......
  • C语言函数栈帧的创建与销毁(32)
    文章目录前言一、什么是函数栈帧?二、理解函数栈帧能解决什么问题?三、函数栈帧的创建和销毁解析什么是栈?认识相关寄存器和汇编指令四、解析函数栈帧的创建和销毁预备知识函数的调用堆栈准备环境转到反汇编函数栈帧的创建函数栈帧的销毁五、回答开篇总结前言应该是......
  • Java 函数式编程(1 万字)
    此笔记来自于B站黑马程序员goodJava历史版本及其优势函数式编程,StreamAPI一.函数伊始函数、函数对象函数对象行为参数法延迟执行a-lambdab-方法引用复习小测Math::random()->Math.random()Math::sqrt(doublenumber)->Math.sqrt(number)Stude......
  • 为什么static类型的成员函数不能被声明为const类型
    错误代码#include<iostream>#include<string>usingnamespacestd;classLion{public: voidsetAge(intage) { this->age=age; } intgetAge()const { returnthis->age; } staticintgetTotalCount()const//error { returntota......
  • 超前校正系统传递函数分析1
    超前校正系统传递函数的一般形式为H(s)=......
  • 超前校正系统传递函数分析2
    超前校正系统传递函数的一般形式为H(s)=......
  • Python 给函数加上状态的多种方式
    Python给函数加上状态的多种方式为什么要给函数加状态?方法一:使用函数属性方法二:使用闭包方法三:使用类方法四:使用装饰器为什么要给函数加状态?通常,函数是无状态的:每次调用它都会从相同的初始状态开始执行。而有时候,我们希望函数在多次调用之间能够保留某些信息,例如记......