访问权限
为编辑类成员的访问权限,我们提供了一种特殊的语法(在结构体一章中已经介绍过)。在块中类成员说明之前的任意位置,都可以插入一个修饰符:三个关键字(private、protected、public)之一和一个冒号。
修饰符之后的所有成员都将接受相应的可见性约束,除非遇到另一个修饰符或者类结束。
例如,下面的条目与前面对 Shape 类的说明相同,因为没有修饰符的类都假定为 private 模式:
class Shape
|
如果我们想开放对所有字段的访问,可以将修饰符改为 public
class Shape
|
但这违反了封装原则,我们不会这么做。但我们可以插入 protected 修饰符:它允许从派生类访问成员,同时又不对外界公开。我们计划将 Shape 类扩展到其他几个形状类,它们都需要访问父类的变量。
class Shape
|
因此,我们将这两个函数都设为公共。
修饰符可以以任意方式交错出现在类说明中,并重复出现多次。不过,为了提高代码的可读性,建议将 public、protected 和 private 成员放在一个段中,并在项目的所有类中保持相同的顺序。
请注意,我们在 toString 函数头的末尾添加了 const 关键字。这意味着该函数不会改变对象字段的状态。尽管这不是必需的,但它有助于防止变量意外损坏,同时也让类的用户和编译器知道调用该函数不会产生任何副作用。
在 toString 函数中,就像在任何类方法中一样,字段可以通过名称访问。稍后,我们将看到如何将 方法声明为静态:它们完全与类相关,而与对象实例无关,因此字段不能被访问。
现在,我们可以从 s 对象变量中调用 toString 方法:
void OnStart()
|
在这里,我们可以看到点字符 '.' 用作特殊的取消引用操作符:它提供了对对象成员(字段和方法)的访问权限。它的左边应该是一个对象,右边是一个可用属性的标识符。
toString 方法是公共的,因此可以从 OnStart 类函数外部访问。如果我们试图在 OnStart 中通过取消引用来访问 s.x 或 s.y 字段,就会出现编译错误“无法访问 'Shape' 类中声明的受保护成员”。
C++ 专业开发者需要注意一下,MQL5 不支持所谓的“友元”(对于其他语言的开发者,我们解释一下,在 C++ 中,如果有必要,可以将具有扩展权限的第三方类和方法列入“白名单”,尽管它们不是“亲属”)。
当我们运行程序时,会看到它输出了几个数字。不过,坐标值是随机的。即使偶尔看到空值,也不能保证下次运行脚本时会出现空值。通常,如果 MQL 程序执行列表在终端中没有变化,那么重复启动任何脚本都会为其分配相同的内存区域,这可能会给人一种“对象状态稳定”的假象。事实上,对象的字段和局部变量一样,默认情况下不会初始化(参见 初始化一节)。
要对它们进行初始化,需要使用特殊的类函数―构造函数。