数据封装如何在OOP中实际发生?

时间:2017-11-13 07:06:57

标签: c++ oop

我正在学习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

使用封装的主要优点是保护来自其他方法的数据,当我们将数据设为私有时,这些数据仅在类中使用,但这些数据在类外无法访问。

代码下面发生了什么,编译器做了什么使得其他类无法访问?在给定的示例中,将abc定义为私有的原因是什么。

他们试图隐藏&#34;只是三个变量的声明&#34;?因为任何人都可以看到公共内部使用的三个数字是abc - 前两个用于输入,第三个用于输出。

2 个答案:

答案 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()接受的引用。因此允许从类的范围之外进行修改。