C++中的访问控制:public、private、protected、friend

在 C++ 中,publicprivateprotected 是用于访问控制的修饰符,而 friend 是一个用于特殊访问权限的关键字。下面分别解释这些关键字的含义和用法。

public

  • 访问权限:无限制
  • 作用域:类的内部和外部
  • 用途:用于定义那些可以被任何人访问的成员变量或成员函数。

private

  • 访问权限:仅限类内
  • 作用域:仅在该类的成员函数和友元函数中可访问
  • 用途:用于实现封装和隐藏内部实现细节。

protected

  • 访问权限:限制性的
  • 作用域:在该类、派生类以及友元函数中可访问
  • 用途:通常用于那些需要在派生类中可访问,但不希望暴露给类的用户的成员。

friend 细节:

  • 访问权限:特权访问
  • 作用域:在友元函数或友元类中
  • 用途:用于某些特殊情况,一个函数或类需要访问另一个类的私有或受保护成员。友元关系是单向的,不能被继承或传递。

下面是一个使用 friend 关键字的示例代码,其中包含两个类 ClassAClassB,以及一个能够访问这两个类私有成员的友元函数 showValues

#include

class ClassA;
class ClassB;

void showValues(const ClassA& a, const ClassB& b);

class ClassA {
    friend void showValues(const ClassA& a, const ClassB& b);
private:
    int valueA;
public:
    ClassA(int a) : valueA(a) {}
};

class ClassB {
    friend void showValues(const ClassA& a, const ClassB& b);
private:
    int valueB;
public:
    ClassB(int b) : valueB(b) {}
};

void showValues(const ClassA& a, const ClassB& b) {
    std::cout << "ClassA value: " << a.valueA << std::endl;
    std::cout << "ClassB value: " << b.valueB << std::endl;
}

int main() {
    ClassA a(1);
    ClassB b(2);
    showValues(a, b);
    return 0;
}

输出结果:

ClassA value: 1
ClassB value: 2

在上述代码中,showValues 函数是 ClassAClassB 的友元函数,它可以访问这两个类的私有成员 valueAvalueB。要使这种访问成为可能,我们需要在类定义之前声明 showValues 函数。这是因为在 ClassA 的定义中使用了 ClassB 作为参数,而在这一点上 ClassB 还未被定义,所以是一个不完整的类型。通过在两个类之前声明 showValues 函数,编译器在处理类定义时已经知道了 showValues 函数的原型。

如果我们只有一个类,那么在类内部声明友元函数就足够了,不需要在类外部进行额外的声明,因为没有涉及到其他不完整的类型。当只有一个类时,编译器可以轻松理解友元声明,因为它没有引用其他未定义的类。

在实际开发中,更妥善的方法是,严格按照类声明的 .h 文件,类定义的 .cpp 文件,主函数调用的 .cpp 文件分离编译。

你可能感兴趣的:(c++,算法,开发语言)