2

我已经声明了这个类。我观察到在方法 distance(Point b) 中,如何访问 Point - bx 和 by 的私有成员?如果我尝试访问 bx 并在 main 中访问,则不允许。

#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 上编译并运行了该程序

4

2 回答 2

4

诸如 等访问说明符的概念private适用publicclasses,而不仅仅是类的对象。如果一个变量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;                                                      

}
于 2013-04-01T06:18:26.813 回答
0

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

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

如果你保持[int x,ypublic不是正确的OOPs],任何函数(主要等)都可以访问它并将值修改为不受欢迎的值。

Point p;

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

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

于 2013-04-01T06:31:51.663 回答