为什么允许访问私有变量?

时间:2013-04-01 06:11:43

标签: c++

我声明了这个类。我观察到在方法距离(点b)中,如何访问Point-b.x和b.y的私有成员?如果我尝试在main中访问b.x和b.y,则不允许。

#include <iostream>
#include <cmath>

using namespace std;

class Point {
private:
    int x, y;
public:
    Point() {
        cout << "Constructor called" << endl;
        x = 0; y = 0;
    }

    ~Point() {
    }

    void set(int a, int b) {
        x = a;
        y = b;
    }

    void offset(int dx, int dy) {
        x += dx;
        y += dy;
    }

    void print() {
        cout << "(" << x << "," << y << ")" << endl;
    }

    // HERE
    double distance(Point b) {
        return (sqrt(pow(x-b.x, 2)+pow(y-b.y, 2)));
    }
};

int main() {
Point p, q;

p.print();
p.offset(4, 3);
p.print();

q.set(10, 2);

cout << "Distance: " << p.distance(q) << endl;

return 0;
}

注意:我已在ideone.com上编译并运行该程序

2 个答案:

答案 0 :(得分:4)

privatepublic等访问说明符的概念适用于classes,而不仅仅是类的对象。如果类中的变量为private,并且该类的对象A具有接收同一类的另一个对象B的函数,则A可以访问B的私有成员,因为A和B属于同一个类。

复制构造函数依赖于此:

#include <iostream>                                                                

using namespace std;                                                            


class A {                                                                       
  public:                                                                       

     A(){val = 1.0;}                                                            

     //copy constructor                                
     A(const A& _other) {                                                       
       val = _other.val; //accessing private member of _other                   
     }                                                                          

    double dist(A _a) {return val - _a.val;} //accessing private member of _other

  private:                                                                      
    double val;                                                                 
};                                                                              


int main() {                                                                    

A a;                                                                            
A b;                                                                            

cout << a.dist(b) << endl;                                                      

}

答案 1 :(得分:0)

int x, y; 属于Class Point 。这意味着Class Point的所有成员都可以访问,修改它。

Class Point的函数和构造是公共的,即其他函数(来自其他类等)[如main]可以访问它们。 OOPS的想法是保证您的数据安全,任何想要修改值的人都可以通过该类的公共方法来实现。他们无法直接访问它们。这样您就可以检查对数据的无效修改[设置height = -4;等无效值

如果你将int x,y保留为public [这是不正确的OOP],任何函数(主等)都可以访问它并将值修改为不合需要的值。

Point p;

p.x = -5(假设你只想要x的+ ve值,你无法检查访问的函数是否设置了一些不合需要的值)``

不是一个相关的比喻,但仍然......你家里有一个只有家庭成员才能进入的房间。任何希望保留或移除或对房屋内的物品做任何事情的外人都必须要求您的家人这样做。如果你认为即使是家庭成员也不允许进入房间[假设即使会员功能无法访问变量]那么也不会在房间里保留任何东西[数据不能被任何人使用]