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

Why is accessing private variable allowed here?

本文关键字:变量 访问 这里 许访问 为什么      更新时间:2023-10-16

我声明了这个类。我观察到,在方法距离(点b),如何可能访问点- 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

诸如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;                                                      
}

int x, y;对于类点来说是私有的。这意味着类点的所有成员都可以访问、修改它。

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

如果你保持int x,ypublic[这是不正确的OOPs],任何函数(main等)都可以访问它并将其值修改为不希望的值。

Point p;

p.x = -5(假设您只想为x设置5个值,您无法检查访问函数是否设置了一些不希望的值)'

这不是一个相关的比喻,但仍然…你在家里有一个房间,只有家庭成员可以进入。任何外人想要保留或移走,或对房子里的东西做任何事情,都必须征得你的家人的同意。如果你假设即使是家庭成员也不允许访问房间[假设即使是成员函数也不能访问变量]那么在房间里保留任何东西都没有用[数据不能被任何人使用]