首页 >后端开发 >C++ >C++ 友元函数与访问控制的冲突

C++ 友元函数与访问控制的冲突

王林
王林原创
2024-04-16 18:09:01656浏览

在 C 中,友元函数与访问控制可能会冲突。要访问私有成员,可以将成员声明为受保护或使用代理函数。例如,Student 类有私有成员 name 和 score,友元函数 printName 和 printScore 可分别打印这些成员。

C++ 友元函数与访问控制的冲突

C 友元函数与访问控制的冲突

在 C 中,友元函数是可以访问类私有成员的非成员函数。但是,当涉及到访问控制时,友元函数可能会遇到与类成员访问控制的冲突。

访问控制

C 提供了三种访问控制级别:

  • public: 可从类的任何地方访问。
  • protected: 只能从类及其派生类中访问。
  • private: 只能从类内部访问。

友元函数

友元函数是通过 friend 关键字声明的。友元函数可以访问类的所有成员,无论访问控制级别如何。但是,友元函数不会成为类的一部分。

访问控制冲突

当友元函数试图访问私有成员时,就会发生访问控制冲突。例如:

class MyClass {
private:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};

在这个例子中,printX 函数是类的友元,但它试图访问私有成员 x。这会导致编译器错误。

解决冲突

要解决访问控制冲突,可以使用以下方法:

1. 使用保护成员

将私有成员声明为受保护成员。这允许派生类和友元函数访问该成员。

class MyClass {
protected:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};

2. 使用代理函数

创建另一个类成员函数作为私有成员的代理。这个代理函数可以公开访问,供友元函数使用。

class MyClass {
private:
    int x;

public:
    int getX() const { return x; }

friend void printX(MyClass& obj) {
    std::cout << obj.getX() << std::endl;
}
};

实战案例

在以下实际案例中,我们有一个 Student 类,它有 namescore两个私有成员。我们想要创建两个友元函数 printName()printScore(),用来分别打印这些私有成员。

class Student {
private:
    std::string name;
    int score;

friend void printName(Student& obj) {
    std::cout << "Name: " << obj.name << std::endl;
}

friend void printScore(Student& obj) {
    std::cout << "Score: " << obj.score << std::endl;
}
};

使用友元函数,我们可以轻松地打印学生的姓名和成绩,即使它们是私有成员。

int main() {
    Student student;
    student.name = "John Doe";
    student.score = 95;

    printName(student);
    printScore(student);

    return 0;
}

输出:

Name: John Doe
Score: 95

以上是C++ 友元函数与访问控制的冲突的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn