4

一段时间以来,我一直在尝试学习 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"当我尝试使用addor时,我不应该得到类似的错误sub吗?

gcc使用版本编译的程序4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)。运行时输出:

(13, 6)
 (3, 1)
4

7 回答 7

7

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

这与许多人认为的安全无关。这是关于向其他代码隐藏类的内部结构。要求一个类不会意外地弄乱其他实例,因此没有必要对其他实例隐藏变量。(实际上这会有点棘手,而且没有或没有理由这样做。)

于 2012-09-28T13:54:26.457 回答
5

private除了 s,成员不能从类外部访问friend,但可以从类内部的任何地方访问。

于 2012-09-28T13:54:26.830 回答
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任何人都可以访问成员。

于 2012-09-28T13:53:41.177 回答
3

因为对这些变量的访问是在类内部通过它的方法进行的;您没有直接访问变量。

于 2012-09-28T13:54:53.537 回答
0

由于add(Point p)sub (Point p)是类的成员Point,它们可以访问Point(在这种情况下p)的任何实例的私有成员,而不仅仅是 object 的私有成员this

于 2012-09-28T14:12:32.747 回答
0

您将“类”与“对象”混淆了。把它放在你的思维方式中。如果两个对象属于同一类,则一个对象可以访问另一个对象的私有成员。

于 2012-09-28T13:59:25.373 回答
-1

您没有直接访问私有类成员。您正在调用作为公共方法的 add() 和 sub() 方法。这些允许访问私有成员变量。

如果您要尝试:

p.x_ ++;

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

于 2012-09-28T13:56:33.507 回答