理解C++中的friend class

一、friend class的概念

C++中的friend关键字用于在类定义中声明其他类或函数为友元,这样它们就可以访问类的私有成员。而friend class则用于声明一整个类为友元。

当一个类被声明为另一个类的友元时,它可以访问该类的私有成员,但并不具备该类的成员函数或方法。而当一个类被声明为另一个类的friend class时,它可以访问该类的私有成员和成员函数或方法。

二、friend class的使用场景

friend class的使用场景多种多样,下面介绍其中两种典型的情境。

1.友元类与封装的关系:

class Box
{
private:
    int length;
    int width;
    int height;

public:
    Box(int l = 0, int w = 0, int h = 0) 
    {
       length = l;
       width = w;
       height = h;
    }

    friend class BoxVolume; // 声明BoxVolume类为Box的友元类
};

class BoxVolume
{
public:
    int getVolume(Box &box) {
        return box.length * box.width * box.height;
    }
};

在上面的示例中,我们声明BoxVolume类为Box类的友元类,这样BoxVolume类就可以访问Box类的私有成员length、width和height,并利用它们计算出Box的体积。

2.友元类与继承的关系:

class Fruit
{
protected: // 注意这里使用protected而不是private
    int weight;

public:
    Fruit(int w) : weight(w) {}

    void showWeight() {
        std::cout << "Fruit's weight is: " << weight << std::endl;
    }

    friend class Apple; // 声明Apple类为Fruit的友元类
};

class Apple : public Fruit
{
public:
    Apple(int w) : Fruit(w) {}

    void showWeight() {
        std::cout << "Apple's weight is: " << weight << std::endl;
    }

    void showFruitWeight(Fruit &fruit) {
        std::cout << "Fruit's weight is: " << fruit.weight << std::endl;
    }
};

在上面的示例中,我们声明Apple类为Fruit类的友元类,这样Apple类就可以访问Fruit类的受保护成员weight,并将其作为Apple类自己的成员使用。

三、friend class的优缺点

friend class的优点在于它可以加强类与类之间的关系,提供更为灵活的访问权限控制。在某些场景下,如上面两个示例所示,friend class可以极大地简化类的实现过程,提高程序的执行效率。

然而,friend class也存在缺点。首先,它破坏了面向对象的封装性,让友元类得以在类内直接访问另一个类的私有成员和方法,导致程序难以维护和拓展。其次,使用friend关键字增加了代码复杂度,需要更多的注释和说明。

四、总结

friend class是C++面向对象编程中一个非常有用的概念,可以提高程序的执行效率和灵活性,但也需要注意封装性及代码复杂度。在使用friend class时,需要对其使用的场景和影响进行合理的权衡和把握。

原创文章,作者:AQZO,如若转载,请注明出处:https://www.506064.com/n/145640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
AQZO的头像AQZO
上一篇 2024-10-27 23:51
下一篇 2024-10-27 23:51

相关推荐

  • Idea新建文件夹没有java class的解决方法

    如果你在Idea中新建了一个文件夹,却没有Java Class,应该如何解决呢?下面从多个方面来进行解答。 一、检查Idea设置 首先,我们应该检查Idea的设置是否正确。打开Id…

    编程 2025-04-29
  • Python Class括号中的参数用法介绍

    本文将对Python中类的括号中的参数进行详细解析,以帮助初学者熟悉和掌握类的创建以及参数设置。 一、Class的基本定义 在Python中,通过使用关键字class来定义类。类包…

    编程 2025-04-29
  • Class对象-解析从入门到精通

    一、Class对象 Java语言中,每一个类都有一个对应的Class对象。一个类被加载到JVM中之后,系统会为其生成唯一的Class对象。该对象包含了类的完整结构信息,如类的构造方…

    编程 2025-04-23
  • 全面了解C++ enum class

    一、enum class的简介 1、C++中常用的枚举类型是enum,但是enum的作用域是全局的,所以容易产生命名冲突的情况;而C++11中新增了enum class,可以将其作…

    编程 2025-04-23
  • 深入浅出public final class

    在Java语言中,public final class是一个常见的关键字组合,用于定义一个不可被继承的类。本文将从多个方面详细阐述public final class的使用,帮助读…

    编程 2025-04-23
  • CSS多个class共用写法

    一、定义多个class 在CSS中,可以为同一元素定义多个class,以实现不同样式的复用。 <div class=”box red”></div> .bo…

    编程 2025-04-18
  • s-class的全能力解析

    一、什么是s-class? s-class是一种Mercedes-Benz的高端轿车型号,它被设计成既可以用作豪华家庭用车,又可以用作优秀的商务车。 二、s-class的外观特点 …

    编程 2025-04-12
  • 深入了解class标签

    一、class标签的作用 class标签可以用来为HTML元素附加一个或多个class名称,这些名称通常被用来为多个元素定义一个样式或多个样式规则,并且可以通过多个class名称指…

    编程 2025-04-12
  • python class和def的区别

    Python是一种面向对象的编程语言,其中类(class)和函数(def)是其中的重要组成部分。尽管类和函数在形式上有点相似,但它们在实际应用中有很大的不同。在本文中,我们将深入探…

    编程 2025-02-01
  • 深入理解Vue-Class-Component框架

    Vue.js是一个优秀的渐进式JavaScript框架,提供了独特的template syntax以及丰富的生态系统。当我们在使用Vue.js时,我们可以结合其他工具库来提高我们的…

    编程 2025-01-20

发表回复

登录后才能评论