我正在学习C ++。
在网站上遇到数据封装和数据隐藏,请查看以下代码:
#include<iostream.h>
#include<conio.h>
class sum {
private: int a, b, c;
public:
void add() {
clrscr();
cout << "Enter any two numbers: ";
cin >> a >> b;
c = a + b;
cout << "Sum: " << c;
}
};
void main() {
sum s;
s.add();
getch();
}
现在。正如它所说here:
使用封装的主要优点是保护来自其他方法的数据,当我们将数据设为私有时,这些数据仅在类中使用,但这些数据在类外无法访问。
代码下面发生了什么,编译器做了什么使得其他类无法访问?在给定的示例中,将a
,b
和c
定义为私有的原因是什么。
他们试图隐藏&#34;只是三个变量的声明&#34;?因为任何人都可以看到公共内部使用的三个数字是a
,b
和c
- 前两个用于输入,第三个用于输出。
答案 0 :(得分:4)
如何可能无法访问private下的数据 在课外?
编译器确保您没有。如果您尝试在课外访问说a
,则代码将无法编译。
在给定的例子中,定义a,b和c的原因是什么 作为私人。
它可能是任何东西!但结果是,a,b和c在课堂成员之外无法访问。
基本上,为了保持一致性,您希望隐藏类中的某些变量。这样您或您的客户就无法生成代码,从而产生不必要的和不受控制的更改。
<强>更新强>
代码下面会发生什么,编译器做了什么 其他课程无法进入?
编译器实现在生成代码时检查访问级别。如果出现问题,您将收到语法错误,并且不会从您的文件生成任何机器代码。
在给定的例子中,定义a,b和c的原因是什么 作为私人;他们试图通过隐藏“只是 声明三个变量“?因为任何人都可以看到 在公共场所内使用的三个数字是a,b和c - 前两个用于 输入和输出的第三个。
您不会隐藏类中的变量,使其对其他人不可见。不打算从类外部使用的私有变量可以标记为private
,以限制编码错误的可能性。
作为一个例子,请考虑以下课程:
class rectangle {
public:
int width;
int height;
int area;
};
void something_important(const rectangle& r) {
// ...
}
如果我传递宽度为-10,高度为0且面积为-15的矩形,会发生什么?可能会发生飞机失事或核武器射向某个错误目标......所以我会确保我的矩形始终有效:
class rectangle {
public:
void set_width(int w) {
if(w) width = w;
else width = 0;
area = width*height;
}
int get_width() const {return width;}
void set_height(int h) {
if(w) height = h;
else height = 0;
area = width*height;
}
int get_height() const {return height;}
int get_area() const {return area;}
private:
int width;
int height;
int area;
};
因此,没有人可以制作负高度或宽度的矩形,也没有人可以制作具有错误区域的矩形。 (你实际上不能直接改变区域)
我希望你现在有意义。
答案 1 :(得分:3)
代码下面会发生什么,编译器做了什么使得其他类无法访问?
不多。编译器不保护不访问数据。它可以防止访问数据名称。例如:
void foo(class bar&, int&);
class bar {
int i = 0;
public:
void baz() {
foo(*this, i);
}
};
void foo(class bar& b, int& i) {
//b.i = 42; // This is an error. b.i is private
i = 42; // This is okay, no matter what the local i refers to
}
在上面的示例中,foo()
无法按名称访问b.i
,因为它是私有数据成员。但如果通过其他方式获得参考,它仍然可以修改它。有权访问该名称的成员函数baz()
将其绑定到foo()
接受的引用。因此允许从类的范围之外进行修改。