1

在 C++ 中,字段或方法的访问说明符基于其在先前声明的第一个访问说明下的位置:

public:
  int my_public_variable;
private:
  void secretPrivateOperations();
  int internal_counter;

Java 通过将访问说明符添加到每个方法/字段来指定访问的设计原理是什么?

public int my_public_variable;
private void secretPrivateOperations();
private int internal_counter;
4

2 回答 2

2

要添加到awksp答案,让我们考虑一个简短的示例。很多时候,您拥有使用您不想公开的私有方法实现的公共 API 方法。您通常希望这些方法的代码彼此靠近以使代码更易于阅读,如果您不这样做,它可能如下所示:

public:
    void api1() { 
        do_some_stuff();
        private_method();
        some_other_stuff();
    }

   void api2() {
        do_something();
   }

   int api3() {
        int i = a_computation();
        return i + A_CONSTANT;
   }

private:    
   void private_method() {
        do_clever_stuff();
        api1_implementation_details();
   }

这不是很好阅读,private_method远非唯一使用它的方法,api1. 代码的这种公共/私人划分没有任何逻辑意义。您希望您的代码按其逻辑组织,而不是按方法的可见性。

我非常喜欢看到这个:

// I can read the whole logic of this method without any clutter
public void api1() { 
   do_some_stuff();
   private_method();
   some_other_stuff();
}

private void private_method() {
   do_clever_stuff();
   api1_implementation_details();
}
// and so on...
于 2015-09-29T22:43:02.620 回答
2

相比:

public:
    T a();
    T b();
    ...
    T z();

相对

public:
    T a() {
        <lots of code>
    }
    T b() {
        <lots of code>
    }
protected:
    T c() {
        <more code>
    }
public:
    T d() {
        <more code>
    }

如果你像这样“分解”访问说明符,事情很快就会变得非常糟糕。是的,缩进有帮助。是的,你有 Ctrl-F。但是仍然可能有很多噪音需要查看(例如,数千行文件),并且为了寻找这种东西而不得不将注意力从任务上移开可能无助于提高生产力。

Java 和 C++ Java 以不同的方式处理它。Java 将访问说明符保留在本地,因此了解您正在使用的方法足以确定范围。C++ 将声明填充在一起,因此可以“分解”访问说明符。实现方法时可能不太好,但在头文件中更简洁,也可能更容易理解。

于 2015-09-29T22:32:15.577 回答