C++私人成员是否可访问

C++ private members accessible?

本文关键字:访问 是否 成员 C++      更新时间:2023-10-16

我在使用C++的signals类中有这个项目。当我看到这个时,我正在修改我们的教官代码:

ListData::ListData(const ListData& newlist) 
    : Data(), nbNodes(newlist.nbNodes) {}

正如他所说,这是一个"复制构造函数",应该大致相当于以下内容:

ListData::ListData(const ListData& newlist){
  Data = "";
  //copy nbNodes of newList to current instance
  nbNodes = newlist.nbNodes;
}

但令我困扰的是,nbNodes是一个私人会员如果传递的newListnbNodes是私有的,该构造函数如何访问它

私有成员的一个有趣之处在于,同一类型的两个对象可以自由访问彼此的私有成员。你可以把它想象成一个阶级总是与自己交朋友。由于这是ListData的构造函数,而newlist也是ListData,所以您可以很好地访问它的private。

这里有一个例子:

#include <iostream>
class foo
{
  public:
    foo() { }
    foo(std::string secret) : secret(secret) { }
    void steal_secret(const foo& other) { secret = other.secret; }
    std::string get_secret() { return secret; }
  private:
    std::string secret;
};
int main() {
    foo f1("I'm actually a bar");
    foo f2;
    f2.steal_secret(f1);
    std::cout << f2.get_secret() << std::endl;
    return 0;
}

f2愉快而轻松地从f1窃取secret,尽管它是私有的。

允许这样做的原因很简单,因为private并不意味着对对象是私有的,它意味着对类是私有的。这简化了诸如复制构造函数之类的函数的实现,这些函数需要对同一类的两个对象的内部进行一些工作。

该规则来自private(§11/1(的定义:

一个类的成员可以是

  • private;也就是说,它的名称只能由声明它的类的成员和朋友使用
  • […]

请注意,它是根据类而不是对象来定义的。

private关键字具有类语义而非对象语义。因此,一个类的对象的私有成员可以访问同一类的其他对象。

nbNodesListData是私有的,而不是对该类的特定实例。因此,在类的代码中,您可以看到该类的其他实例的私有数据。

如果不是这样,每个类都必须为每个数据成员导出"getter",以便执行副本构造和副本分配。

复制构造函数与任何其他方法一样:由于您可以从一个类的方法访问该类的私有成员,因此您可以对复制构造函数执行同样的操作(否则,如何将实例的状态复制到另一个类?(。

具有private可见性的成员是只能在其所属的成员函数内访问的成员,而不限制对象

如果函数f()是类C的成员函数,则它可以访问C任何实例的private成员,而不仅仅是隐式this指针所指向的成员(当然,这也使这对根本不接收this指针的static函数有效(。

来自C++标准,第11章:成员访问控制:

私有;也就是说,它的名称只能由的成员和朋友使用在其中声明它的类。

这意味着私有成员可以被该类的任何成员访问

这里ListData::ListData(const ListData& newlist)是ListData的复制构造函数,它是一个成员函数,因此可以访问类ListData的私有成员。