117.info
人生若只如初见

C++友元类如何定义和使用

在C++中,友元类(friend class)是一种特殊的类关系,允许一个类访问另一个类的私有(private)和保护(protected)成员。友元类不是被另一个类包含的类,而是与另一个类有相互访问权限的类。

要定义一个友元类,需要在类声明中使用friend关键字。这里有一个简单的例子来说明如何定义和使用友元类:

#include 

// 声明类A
class A {
public:
    A(int value) : value_(value) {}

    // 声明类B为友元类
    friend class B;

    // 定义一个公有成员函数,用于输出类A的成员变量
    void printValue() const {
        std::cout << "Value of A: " << value_ << std::endl;
    }

private:
    int value_;
};

// 声明类B
class B {
public:
    B(int value) : value_(value) {}

    // 定义一个成员函数,用于访问类A的私有成员变量
    void printAValue() const {
        std::cout << "Value of A: " << a_.value_ << std::endl;
    }

private:
    int value_;
    // 定义一个友元声明,允许类B访问类A的私有成员变量
    friend class A;
};

int main() {
    A a(10);
    B b(20);

    // 使用类A的成员函数输出其私有成员变量
    a.printValue();

    // 使用类B的成员函数访问类A的私有成员变量
    b.printAValue();

    return 0;
}

在这个例子中,我们有两个类:AB。类A有一个私有成员变量value_,而类B有一个私有成员变量value_和一个成员函数printAValue()。我们在类A的声明中使用friend class B;将类B声明为友元类,这样类B就可以访问类A的私有成员变量value_。同样,我们在类B的声明中使用friend class A;将类A声明为友元类,这样类A就可以访问类B的私有成员变量value_

main()函数中,我们创建了类A和类B的实例,并使用它们的成员函数分别输出各自的私有成员变量。

未经允许不得转载 » 本文链接:https://www.117.info/ask/febddAzsBCQZW.html

推荐文章

  • c# java咋选择

    在编程领域,C#和Java都是非常流行且功能强大的编程语言。它们各自有着自己的优势和特点,选择哪种语言取决于你的具体需求和目标。以下是一些关于C#和Java的对比...

  • c# directory能复制目录吗

    是的,C#中的Directory类提供了方法来复制目录。以下是一个示例代码,展示了如何使用Directory.Copy方法来复制目录及其内容:
    using System;
    using Sy...

  • c# directory怎样检查目录存在

    在C#中,你可以使用System.IO命名空间中的Directory类来检查目录是否存在。以下是一个示例代码:
    using System;
    using System.IO; class Program

  • c# directory能重命名目录吗

    在C#中,你可以使用System.IO命名空间中的DirectoryInfo类来重命名目录。以下是一个示例代码,展示了如何重命名目录:
    using System;
    using System.IO...

  • C++命名空间如何进行动态分配

    在C++中,命名空间主要用于组织和防止名称冲突。它们不提供动态内存分配功能。动态内存分配通常使用new和delete关键字(或malloc和free函数,尽管不推荐在C++中使...

  • C++命名空间怎样处理大对象

    在C++中,命名空间主要用于解决命名冲突问题。当处理大对象时,命名空间可以帮助组织和管理代码,使其更易于阅读和维护。以下是一些建议,以帮助您在C++中使用命...

  • C++命名空间如何进行内存映射

    在C++中,命名空间(namespace)是一种用于组织代码的方式,它可以帮助我们避免命名冲突 使用std::map或std::unordered_map: std::map和std::unordered_map是C+...

  • C++命名空间如何进行跨平台开发

    在C++中进行跨平台开发时,使用命名空间可以有效地组织代码并避免命名冲突。以下是一些建议,可以帮助您在跨平台开发中使用命名空间: 使用标准库命名空间:C++标...