【问题标题】:Private functions of a class accessible?可访问类的私有函数?
【发布时间】:2023-03-04 01:17:02
【问题描述】:

我已经尝试学习 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 ) 方法有效。

当我尝试使用addsub 时,我不应该收到"cannot access private properties of class Point" 之类的错误吗?

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

(13, 6)
 (3, 1)

【问题讨论】:

  • 它是Point 类的一部分,因此它可以访问自己的私有成员。
  • 不能访问自己的隐私会有多糟糕?
  • 访问说明符是每个类型而不是每个实例。因此,在成员方法中,您可以访问所有私有成员,无论它们属于此实例还是其他实例。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    private 成员不能从类外部访问,friends 除外,但可以从类内部的任何位置访问。

    【讨论】:

      【解决方案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 成员。

      【讨论】:

      • 我认为 OP 是在询问成员变量。
      • @Mahesh “当我尝试使用 add 或 sub 时,难道我不应该收到类似“无法访问类 Point 的私有属性”或类似的错误吗?”
      • 我认为您可以将 "should" 替换为 "must" 。 :-)
      • @LuchianGrigore 可能我误解了这个问题。 OP的疑问不是关于如何在当前对象中访问其他对象的私有变量吗?虽然两个对象的类型相同。
      • @Mahesh 现在我重新阅读了,我想它可以双向解释。无论如何,经过编辑以反映这两个方面...
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            如果你要尝试:

            p.x_ ++;
            

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

            【讨论】:

            • 可以否决投票者请发表评论?我无法弄清楚我的答案有什么不正确的地方。
            • 您因为没有回答实际问题而投了反对票。
            猜你喜欢
            • 1970-01-01
            • 2011-05-03
            • 2011-12-29
            • 1970-01-01
            • 2011-02-05
            • 1970-01-01
            • 2014-12-29
            • 1970-01-01
            • 2021-07-23
            相关资源
            最近更新 更多