C++封装,有什么用
C++ encapsulation, how is it useful
下面的幻灯片引用了 C++ 语言,它说
"encapsulation is about ensuring the user uses our ADT in a safe way"
但是,如果他可以访问我的 .h 文件,他可以编辑它,例如将我的 class 中声明的内容从私有更改为 public。
例如:
my_file.h:
class Complex {
private:
double re, im;
public:
double get_re();
};
然后用户可以写:(从私有更改为 public)
Complex s1;
s1.re=13;
请点击以下link查看图片(因为我没有点包含图片):
enter image description here
使用 C++,您可以通过多种方式攻击您的脚。您也可以使用
#define private public
并且您无需更改代码中的任何内容即可访问私有接口...这里的重点不是如何破坏封装,而是关于您使用它实现的目标。
当你必须在 class
和 struct
之间做出选择时,你必须考虑你要用它来表示什么,如果那个东西有不变性,那么你应该使用class,否则一个 struct: encapsulation 会让你实现 "invariant" 使用封装,从而让用户访问数据,或者 set/modify 数据只使用 public 接口你已经定义了,而不是他想要的。
例如,如果你定义一个class Date
,你有一个像"max 31 as day, max 12 as month ..."这样的不变量,但是如果你想定义例如DifferenceInDays
,它将对于 days
,只有一个 int
,你可以允许用户在该结构中读取和写入他想要的任何内容,因为你没有任何不变性
下面的幻灯片引用了 C++ 语言,它说
"encapsulation is about ensuring the user uses our ADT in a safe way"
但是,如果他可以访问我的 .h 文件,他可以编辑它,例如将我的 class 中声明的内容从私有更改为 public。
例如:
my_file.h:
class Complex {
private:
double re, im;
public:
double get_re();
};
然后用户可以写:(从私有更改为 public)
Complex s1;
s1.re=13;
请点击以下link查看图片(因为我没有点包含图片): enter image description here
使用 C++,您可以通过多种方式攻击您的脚。您也可以使用
#define private public
并且您无需更改代码中的任何内容即可访问私有接口...这里的重点不是如何破坏封装,而是关于您使用它实现的目标。
当你必须在 class
和 struct
之间做出选择时,你必须考虑你要用它来表示什么,如果那个东西有不变性,那么你应该使用class,否则一个 struct: encapsulation 会让你实现 "invariant" 使用封装,从而让用户访问数据,或者 set/modify 数据只使用 public 接口你已经定义了,而不是他想要的。
例如,如果你定义一个class Date
,你有一个像"max 31 as day, max 12 as month ..."这样的不变量,但是如果你想定义例如DifferenceInDays
,它将对于 days
,只有一个 int
,你可以允许用户在该结构中读取和写入他想要的任何内容,因为你没有任何不变性