【问题标题】:C++ accessing private members through pointer argumentC++ 通过指针参数访问私有成员
【发布时间】:2018-12-10 03:53:03
【问题描述】:
class Link
{
private:
    string value;
    Link* succ;
    Link* prev;
public:
    Link(string v, Link* s = nullptr, Link* p = nullptr)
    : value(v), succ(s), prev(p) { }
Link* insert(Link* p)
{
    if(p == nullptr) return this;
    p->succ = this;
    if(this->prev) this->prev->succ = p->prev;
    p->prev = this->prev;
    this->prev = p;

    return p;
}
};

int main()
{
    Link* language = new Link{Link("C++", nullptr, nullptr)};
    language = language->insert(new Link("Python", language, nullptr));

    return 0;
}

在这本书,编程原理和实践中,有一章你实现了列表的一部分,这里是代码。

在上面的代码中,insert() 将 Link* 作为参数并使用 -> 直接改变它指向的内容(Link* succ, prev)。但是 succ 和 prev 都是该类的私有成员,所以我不明白 insert() 如何直接访问它们。

【问题讨论】:

  • 回答这个问题——根据你的推理,如果prev 和succ 是private,它们将/可能会如何改变?一个类可以改变它的内部结构。
  • 访问限制适用于类,不适用于对象。类中的任何方法都可以访问类中任何对象的任何字段。访问受限的是类之外的代码。
  • 你永远是你自己(和你的克隆人)的朋友。 stackoverflow.com/a/437507/14065
  • 半相关说明:private 和 protected 只会让访问错误变得更加困难。他们无法阻止故意规避访问限制的尝试,并且不会让事情搞砸。

标签: c++


【解决方案1】:

在上面的代码中,insert() 将Link* 作为参数并使用-> 直接改变它所指向的内容(Link* succ, prev)。但是succ 和prev 都是private 类的成员,所以我不明白insert() 怎么可能直接访问它们。

在类的成员函数中,可以访问类的private 成员。由于insert() 是Link 的成员函数,您可以在其中访问类的private 成员(prev 和succ)。您不仅可以访问隐式对象的prev 和succ,即this->prev 和this->succ,还可以访问该类的任何实例的prev 和succ 成员。

表格https://en.cppreference.com/w/cpp/language/access(强调我的):

类的私有成员只能由该类的成员和朋友访问,无论成员是在相同还是不同的实例上:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多