【问题标题】:Why can my object not access it's own private member variable? [C++]为什么我的对象不能访问它自己的私有成员变量? [C++]
【发布时间】:2010-11-24 20:27:34
【问题描述】:

我有一个名为class Car 的类,它已被实例化为对象Car car1。 Car的成员变量之一是Car::width,但是当我尝试执行该行时

cout << car1.width << endl;

来自main() 我被告知这是不可能的,因为Car::width 是私有的。我的理解是私有成员可以被它们所属的类的对象访问,但这种情况让我完全难住了。私有成员被自己的对象访问是怎么回事?

【问题讨论】:

  • 该语句在什么函数中?这决定了访问是否是“通过对象”。
  • 除非 main() 是“Car”函数的名称,否则我不明白您为什么认为它试图访问语句中限定的宽度变量,“...私有成员可能是由它们所属的类的对象访问。”

标签: c++ oop


【解决方案1】:

私有成员可以通过它们所属的同一类的方法访问。

【讨论】:

  • 恕我直言,method 在 C++ 中是一个含糊不清的术语,无法使用。通常,“方法”是对象响应发送给它的“消息”所做的事情。在 C 中,您使用对表示对象的结构进行操作的函数来实现“方法”。在 C++ 中,您可以覆盖运算符,以便消息“
  • “方法”是“成员函数”的常用 C++ 术语。甚至 C++ faq 也大量使用了这个,例如:parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.7
【解决方案2】:

Car 可以访问width。但在您的示例中,尝试访问 width 的是 。这正是private的意思。

【讨论】:

    【解决方案3】:

    它可以从一个成员函数内部访问,而不是像你在这里拥有的那样在外部访问。私有变量的全部意义在于阻止您尝试做的事情,即禁止该类的用户使用成员变量。

    【讨论】:

      【解决方案4】:

      如果访问函数(在这种情况下为main)不是您的类Car 的成员或friend,那么编译器正确地说private 成员width 在这个上下文。

      仔细想想,如果任何可以创建Car 的人都可以访问其private 成员,那么隐私就没有多大意义了。您使构造函数public 允许创建对象,但对此类用户隐藏创建的对象的数据成员以正确封装它们。您将对类的 private 内部的操作限制在类的 publicprotected 成员的合法使用所允许的范围内。

      【讨论】:

        【解决方案5】:

        类 Car 上的方法可以访问 width 成员,但您的代码(执行 cout 的代码)不能。

        【讨论】:

          【解决方案6】:
          cout << car1.width
          

          这不是car1 试图到达width -- 这是cout 试图到达widthcout 不是 car1 的成员,所以由于 width 是私有的,它会失败。

          【讨论】:

          • 误导。 cout 与此无关。只有当前的函数定义很重要。如果出现在Car::print() 中,同样的声明是合法的。
          • @aschelper:也许你错过了从main() 执行这段代码的部分?
          • 没有如果,你错了。您的回答声称,“它试图达到宽度”,这是完全不正确的。也许这不是你的意思,但这是你说的。 aschepler 正确地纠正了你。
          猜你喜欢
          • 1970-01-01
          • 2012-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-01
          • 2014-08-05
          相关资源
          最近更新 更多