1

我是 C++ 新手,我熟悉 Java。当我开始查看 C++ 代码时,我首先想知道的是类本身(不是成员)没有访问说明符,例如private,protectedpublic. 这里这里的例子。

public class A { // This line.
  private class B { } // Not this line.
}

为什么呢?

4

4 回答 4

10

在类级别没有访问修饰符,因为该语言没有的概念。但是在数据成员,成员函数和继承级别上有:

class Foo {};
class Bar : public Foo {

 public:
  void bar() const {}
 private:
  int bar_(float) {}
  int a, b, c;

};

最接近的方法是在类中声明嵌套类:

class Foo {

  struct Bar0 {
    void bar0() const {}
  };
  struct Bar1 {
    Bar0 b0;
    Bar1() { b0.bar0();}
  };

};
于 2012-06-04T20:20:23.800 回答
5

不需要类级别的访问说明符。如果你想要一个private类,你可以在实现文件或匿名中定义它namespace。这种限制是在 C++ 的文件级别完成的(即你如何组织你的头文件,预处理器指令)。

编辑前:

他们这样做,但他们不是per-method。此外,类具有默认private说明符,因此,除非另有说明,否则它们是private.

class A
{
   void foo(); //private
};
class B
{
   void foo();  //private
public:
   void foo1(); //public
   void foo2(); //public
protected:
   void foo3(); //protected
private:
   void foo4(); //private
};

注意 1 C++ 也有struct,它与 a 相同,class但默认访问级别是public.

注 2 C++中没有包范围。在 Java 中,protected提供对整个包的访问权限,在 C++ 中,它只提供对派生类的访问权限。

注3关键字friend可以用来绕过限制,查一下。

于 2012-06-04T20:17:43.617 回答
0

C++ 使用稍微不同的语法,其中访问修饰符是为声明组而不是单独指定的:

class Test {
  class MyPrivateClass {
    // ...
  };

  void privateByDefault();

public:
  void myPublicFunction();
  void anotherPublicFunction();

private:
  void myPrivateFunction();

public:
  class MyPublicClass {
    // ...
  };

  void morePublicFunctions();

protected:
  // ...
};

Test::MyPrivateClass在 之外无法访问Test,而Test::MyPublicClass可以在任何地方使用。

于 2012-06-04T20:17:50.677 回答
-1

从您的来源:http ://www.cplusplus.com/doc/tutorial/classes

类的私有成员只能从同一类的其他成员或他们的朋友访问。受保护的成员可以从它们的同一个类的成员和它们的朋友访问,也可以从它们的派生类的成员访问。最后,公共成员可以从对象可见的任何地方访问。

于 2012-06-04T20:20:13.567 回答