无涯教程-D语言 - 类访问修饰符函数

49 阅读2分钟

数据隐藏是面向对象编程的重要函数之一,它可以防止程序的函数直接访问类的内部信息。类成员的访问限制由类主体中标有标签的 public , private 和 protected 修饰符指定,成员和类的默认访问权限为私有。

class Base { 

public:

//public 区

protected:

//protected 区

private:

//private 区

};

Public 公开

public 可以在class以外但在程序内的任何位置访问,您可以在没有任何成员函数的情况下设置和获取公共变量的值,如以下示例所示:

import std.stdio;

class Line { public: double length;

  </span><span class="kwd">double</span><span class="pln"> getLength</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
     </span><span class="kwd">return</span><span class="pln"> length </span><span class="pun">;</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln">
  
  </span><span class="kwd">void</span><span class="pln"> setLength</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> len </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
     length</span><span class="pun">=</span><span class="pln">len</span><span class="pun">;</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 

}

void main( ) { Line line=new Line();

//设置行长 line.setLength(6.0); writeln("Length of line : ", line.getLength());

//在没有成员函数的情况下设置行长 line.length=10.0; //OK: 因为长度是公开的 writeln("Length of line : ", line.length); }

编译并执行上述代码后,将产生以下输出-

Length of line : 6 
Length of line : 10 

Private 私有

private 变量或函数无法访问,甚至无法从类外部进行查看,默认情况下,一个类的所有成员都是私有的。例如,在以下类中, width 是私有成员。

class Box { 
   double width; 
   public: 
      double length; 
      void setWidth( double wid ); 
      double getWidth( void ); 
}

实际上,您需要在私有部分中定义数据,并在公共部分中定义相关函数,以便可以从类外部调用它们,如以下程序所示。

import std.stdio;

class Box { public: double length;

  </span><span class="com">//成员函数定义</span><span class="pln">
  </span><span class="kwd">double</span><span class="pln"> getWidth</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
     </span><span class="kwd">return</span><span class="pln"> width </span><span class="pun">;</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 
  </span><span class="kwd">void</span><span class="pln"> setWidth</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> wid </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
     width</span><span class="pun">=</span><span class="pln">wid</span><span class="pun">;</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln">

private: double width; }

//程序的主要功能 void main( ) { Box box=new Box();

box.length=10.0; writeln("Length of box : ", box.length);

box.setWidth(10.0);
writeln
("Width of box : ", box.getWidth()); }

编译并执行上述代码后,将产生以下输出-

Length of box : 10 
Width of box : 10

Protected  受保护

protected 成员变量或函数与私有成员非常相似,但是它提供了另一个好处,即它的子类对其进行访问。

下面的示例与上面的示例相似,并且 width 成员可由其派生类SmallBox的任何成员函数访问。

import std.stdio;

class Box { protected: double width; }

class SmallBox:Box { //SmallBox 是派生类。 public: double getSmallWidth() { return width ; }

  </span><span class="kwd">void</span><span class="pln"> setSmallWidth</span><span class="pun">(</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> wid </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     width</span><span class="pun">=</span><span class="pln">wid</span><span class="pun">;</span><span class="pln"> 
  </span><span class="pun">}</span><span class="pln"> 

}

void main( ) { SmallBox box=new SmallBox();

//使用成员函数设置框宽度 box.setSmallWidth(5.0); writeln("Width of box : ", box.getSmallWidth()); }

编译并执行上述代码后,将产生以下输出-

Width of box : 5

参考链接

www.learnfk.com/d-programmi…