D 语言 - 类访问修饰符
数据隐藏是面向对象编程的重要特征之一,它允许防止程序的函数直接访问类类型的内部表示。 对类成员的访问限制由类主体中标记的 public、private 和 protected 部分指定。 关键字 public、private 和 protected 称为访问说明符。
一个类可以有多个公共、受保护或私有标记的部分。 每个部分都保持有效,直到看到另一个部分标签或类主体的右大括号为止。 成员和类的默认访问权限是私有的。
class Base {
public:
// public 公共成员在这里
protected:
// protected 受保护成员在这里
private:
// private 私有成员在这里
};
D 中的公共成员
public 成员可以从类之外但程序内的任何地方访问。 您可以设置和获取公共变量的值,而无需任何成员函数,如下例所示 −
示例
import std.stdio;
class Line {
public:
double length;
double getLength() {
return length ;
}
void setLength( double len ) {
length = len;
}
}
void main( ) {
Line line = new Line();
// 设置 line 长度
line.setLength(6.0);
writeln("Length of line : ", line.getLength());
// 不使用成员函数设置 line 长度
line.length = 10.0; // OK: because length is public
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;
// 成员函数定义
double getWidth() {
return width ;
}
void setWidth( double wid ) {
width = wid;
}
private:
double width;
}
// 程序的 main 函数
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 受保护的成员
受保护的成员变量或函数与私有成员非常相似,但它提供了一个额外的好处,即可以在称为派生类的子类中访问它们。
您将在下一章中学习派生类和继承。 现在,您可以检查以下示例,其中一个子类 SmallBox 派生自父类 Box。
下面的示例与上面的示例类似,这里 width 成员可以由其派生类 SmallBox 的任何成员函数访问。
import std.stdio;
class Box {
protected:
double width;
}
class SmallBox:Box { // SmallBox 是派生类。
public:
double getSmallWidth() {
return width ;
}
void setSmallWidth( double wid ) {
width = wid;
}
}
void main( ) {
SmallBox box = new SmallBox();
// 使用成员函数设置box宽度
box.setSmallWidth(5.0);
writeln("Width of box : ", box.getSmallWidth());
}
当上面的代码被编译并执行时,会产生以下结果 −
Width of box : 5
❮ d_programming_classes_objects.html

