【问题标题】:Can we access private members of another object within a method of a class?我们可以在类的方法中访问另一个对象的私有成员吗?
【发布时间】:2021-12-11 08:58:00
【问题描述】:
#include <string>
#include <iostream>
#include <vector>

using namespace std;

class Test {
public:
    int testing() {
        Test t;
        return t.x;
    }
private:
    int x = 0;

};

int main() {
    Test a;
    cout << a.testing() << endl;
}

我不知道我可以在Test 的类定义中访问t 的私有数据成员xTest 的实例不是this)。为什么我可以在示例代码中使用t.x

【问题讨论】:

  • 如果你不能访问班级内的私人数据,你怎么能访问它呢?
  • 编写比较运算符或移动构造函数/赋值时非常重要
  • 你在问为什么你可以从a对象访问t.x?或者为什么你可以从方法中访问private 成员?前者见With a private modifier, why can the member in other objects be accessed directly?
  • “我不知道” 好吧,你为什么知道还有private:class这样的东西呢? 那个来源告诉你什么它是如何工作的? “为什么我可以在下面的代码中使用“t.x”?那么,你认为应该可以在 anywhere 使用t.x 吗?如果不是,那么首先拥有int x = 0; 有什么意义?您希望代码看起来如何,从而导致该值发生变化?拥有无法使用的数据有什么意义?
  • Test 的任何实例都可以查看和操作任何其他Test 实例的所有数据,它可以得到它肮脏的手指。

标签: c++ class private


【解决方案1】:

通俗地说,C++ 的private 是“类私有”而不是“对象私有”。

作用域与源代码的词法元素相关联,而不是与运行时实体本身相关联。此外,编译后的代码几乎不了解源代码中的逻辑实体。出于这个原因,可访问性仅在词法范围级别上强制执行。在类的范围内,该类类型的任何对象都可以访问其私有成员。

另外,否则 C++ 将无法作为一个整体工作。如果基于每个对象检查可访问性,则无法编写复制构造函数或赋值运算符。这些操作需要访问源对象的成员才能初始化/覆盖目标对象。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2017-12-20
    • 2019-04-08
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2017-01-16
    相关资源
    最近更新 更多