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"or を使用しようとすると、 orのようなエラーが発生するべきではありませんaddsub?

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

「クラス」と「オブジェクト」を混同しています。それをあなたの考え方に入れます。両方のオブジェクトが同じクラスである場合、オブジェクトは別のオブジェクトのプライベート メンバーにアクセスできます。

于 2012-09-28T13:59:25.373 に答える
0

add(Point p)sub (Point p)は class のメンバーであるため、 object のプライベート メンバーだけでなく、 (この場合は )Pointの任意のインスタンスのプライベート メンバーにアクセスできます。Pointpthis

于 2012-09-28T14:12:32.747 に答える
-1

プライベート クラス メンバーに直接アクセスしていません。public メソッドである add() および sub() メソッドを呼び出しています。これら、プライベート メンバー変数にアクセスできます。

あなたが試みた場合:

p.x_ ++;

x_ は Point クラスに対してプライベートであるため、これは許可されません

于 2012-09-28T13:56:33.507 に答える