一个班级的私人功能可以访问?

时间:2012-09-28 13:52:13

标签: c++ oop class gcc information-hiding

我一直在尝试学习C ++。最近我遇到了以下代码:

#include <iostream>

using namespace std;

class Point {
    private:
        double x_, y_;

    public: 
        Point(double x, double y){
            x_ = x;
            y_ = y; 
        }

        Point() {
            x_ = 0.0;
            y_ = 0.0;   
        }

        double getX(){
            return x_;  
        }

        double getY(){
            return y_;  
        }

        void setX(double x){
            x_ = x; 
        }

        void setY(double y){
            y_ = y; 
        }

        void add(Point p){
            x_ += p.x_;
            y_ += p.y_;
        }

        void sub(Point p){
            x_ -= p.x_;
            y_ -= p.y_;
        }

        void mul(double a){
            x_ *= a;
            y_ *= a;    
        }

        void dump(){
            cout << "(" << x_ << ", " << y_ << ")" << endl; 
        }
};

int main(){
    Point p(3, 1);
    Point p1(10, 5);

    p.add(p1);
    p.dump();

    p.sub(p1);
    p.dump();

    return 0;
}

对于我的生活,我无法弄清楚为什么方法void add(Point P)void sub( Point p )有效。

当我尝试使用"cannot access private properties of class Point"add时,我是否应该收到sub之类的错误?

使用gcc4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)编译的程序。 运行时输出:

(13, 6)
 (3, 1)

7 个答案:

答案 0 :(得分:7)

私有关键字指定只能从该类的成员函数和朋友访问这些成员。私有变量甚至可以从类的其他实例访问相同类型的对象。

这不是关于许多人的想法的安全性。这是关于从其他代码隐藏类的内部结构。要求一个类不会意外地弄乱其他实例,因此没有必要隐藏其他实例中的变量。 (实际上实现起来会有点棘手,没有或没有理由这样做。)

答案 1 :(得分:5)

private成员除了friend之外,不能从类外部访问,但可以来自类内的任何位置。

答案 2 :(得分:3)

您可以自行调用这些方法,因为它们位于类定义的public部分,并且可以访问private成员,因为它们是类的一部分。

private:
    double x_, y_;

public: 
    Point(double x, double y)
    Point() 
    double getX()
    double getY()
    void setX(double x)
    void setY(double y)
    void add(Point p)
    void sub(Point p)
    void mul(double a)
    void dump()

在这种情况下,private中的字段只能由其他类成员访问(没有朋友)。

任何人都可以访问public个成员。

答案 3 :(得分:3)

因为对这些变量的访问是通过它的方法从 中进行的;你没有直接访问变量。

答案 4 :(得分:0)

你很困惑&#34; class&#34;与&#34;对象&#34;。把它放在你的思维方式。如果两个对象属于同一个类,则Object可以访问另一个对象的私有成员。

答案 5 :(得分:0)

由于add(Point p)sub (Point p)是类Point的成员,因此他们可以访问Point的任何实例的私有成员(在本例中为p)并且不仅是对象this的私有成员。

答案 6 :(得分:-1)

您不是直接访问私有类成员。您正在调用add()和sub()方法,它们是公共方法。允许这些 访问私有成员变量。

如果您尝试:

p.x_ ++;

这是不允许的,因为x_是Point类的私有