使用Cin在类中访问私有成员

时间:2015-05-08 14:15:07

标签: c++

我有点困惑..我的代码在下面

#include <iostream>
using namespace std;
class Test {
    private:
    int x, y;
  public:
    void get(){
        cin>>x;
        cin >>y;
        cout << x;
        cout << y;
    }
};

int main ()
{
  Test obj;
  obj.get();
  return 0;
}

在此代码中,我使用cin访问私人成员.. !!好吗?因为我认为用户可以在程序运行后直接发送值或访问私有成员.. !! 我只是想问一下它是否安全.. !!感谢.. !!

3 个答案:

答案 0 :(得分:4)

阅读有关C ++成员访问者的更多信息。

私人成员只能在定义它们的类中访问。 get()函数属于Test类,因此可以访问私有成员。

答案 1 :(得分:1)

人们已经回答了,但我想给出一个完整的答案:

In this code I'm accessing private members using cin..!! Is it fine?

在代码中,您将从cin获取值并将其存储在成员变量中。这是允许的,但不是编写代码的常规方法。正如其他人所说的那样,每个Test对象都可以访问自己的内部,并且正如所写,它将使用来自cin的数据更新这些内部。很难想象一种有用的语言会妨碍你这样做。

I think user can send values or access private members directly after program run..!!

不,用户不能。程序退出后,内存被释放,所有值都不再存在。

即使程序正在运行,用户也无法访问对象的内部。是的,你向用户询问价值,然后立即告诉用户他们给你的价值,所以没有秘密;但是,用户无法无限制地访问xy。将x设置为5后,如果该程序从未再次调用10,则用户无法将其更改为get()。您可以阅读源代码,并标记允许值更改的每个位置;没有你打电话get(),它永远不会神秘地改变。一个真正的安全漏洞将使价值在您不知情的情况下发生变化。

答案 2 :(得分:0)

在一个类中,private控制名称的可访问性,而不是实际数据。因此,允许类成员函数将对私有成员的引用传递给任何其他函数。

该行

cin >> x;

实际上是对此函数的调用

std::istream& std::istream::operator>>(int&)

get()(成员函数)中的代码可以看到变量x的名称,因此可以形成对它的引用,然后将其传递给operator>>()。就operator>>()中的代码而言,它可以是任何地方的任何int的引用。