总结C ++中的类成员访问规则

问题描述 投票:1回答:1

我试图完全理解C ++标准[class.access]部分的多个段落中定义的类成员访问规则。它们非常复杂,因此我需要简短但准确而详尽的摘要

我编写了此程序来在多种情况下测试受保护成员的可访问性(因为很难获得受保护成员的规则:]

#include <iostream>

class B {
  protected:
    int i = 1;
    static int const I = 1;
};

class X: public B {
  protected:
    int j = 2;
    static int const J = 2;
  public:
    void f();
    friend void g();
};

class D: public X {
  protected:
    int k = 3;
    static int const K = 3;
};

void X::f() {
  B b;
  X x;
  D d;
  //std::cout << b.i;  // error: 'i' is a protected member of 'B'
  std::cout << b.I;
  std::cout << x.i;
  std::cout << x.I;
  std::cout << x.j;
  std::cout << x.J;
  std::cout << d.i;
  std::cout << d.I;
  std::cout << d.j;
  std::cout << d.J;
  //std::cout << d.k;  // error: 'k' is a protected member of 'D'
  //std::cout << d.K;  // error: 'K' is a protected member of 'D'
}

void g() {
  B b;
  X x;
  D d;
  //std::cout << b.i;  // error: 'i' is a protected member of 'B'
  //std::cout << b.I;  // error: 'I' is a protected member of 'B'
  std::cout << x.i;
  std::cout << x.I;
  std::cout << x.j;
  std::cout << x.J;
  std::cout << d.i;
  std::cout << d.I;
  std::cout << d.j;
  std::cout << d.J;
  //std::cout << d.k;  // error: 'k' is a protected member of 'D'
  //std::cout << d.K;  // error: 'K' is a protected member of 'D'
}

int main() {
  X x;
  x.f();
  g();
  return 0;
}

我得出这个结论:

我的摘要准确无误吗?
c++ language-lawyer protected access-specifier
1个回答
1
投票
如果您的问题基于访问权限,则这些是c ++中的规则。我将在下面做一个基本的总结,但是对于详尽的解释,请转到here。这将更详细地介绍它们的工作原理。

  • public-可以在同一类,派生类和外部类中访问函数和变量

  • protected

  • -可以在同一类和派生类中访问函数和变量
  • private

  • -函数和变量可以在同一类中访问。
关于继承,您也有多种类型:

  • public
-公共成员和受保护成员将继承其各自的访问类型
  • protected
  • -公共成员被继承为受保护的成员,受保护的成员将保留其访问类型。
  • 私人
  • -公共和私人成员将被继承

    Note

    :派生类继承基类的所有方法,但以下情况除外。
    • 基类的构造函数,析构函数和复制构造函数
    • 基类的重载运算符。
    • 基类的朋友功能。

    现在对于朋友说明符,这来自cpp参考here在这里,您将获得示例以及有关如何使用它的详细说明。

    您还可以在其中找到有关标准库的大量信息的示例,还可以查看将来标准中的内容以及编译器支持的功能。

    © www.soinside.com 2019 - 2024. All rights reserved.