C ++私有成员可以访问吗?

时间:2013-02-27 14:26:43

标签: c++

我在使用C ++的信号类中有这个项目。当我看到这个时,我正在修补我们的教师代码:

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是私人会员。 如果这个构造函数是私有的,那么该构造函数如何访问传递的nbNodes的{​​{1}}?

6 个答案:

答案 0 :(得分:8)

关于私有成员的一个有趣的事情是,两个相同类型的对象可以自由地访问彼此的私有成员。你可以把它想象成一个班级总是与自己的朋友。由于这是ListData的构造函数,newlist也是ListData,因此您可以正常访问其私有。

Here's an example of this

#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快乐轻松地从secret窃取f1,尽管它是私密的。

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

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

  

班级的成员可以是

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

如果不是这样,每个类都必须为每个数据成员导出“getters”,以便执行复制构造和复制分配。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

复制构造函数就像任何其他方法一样:因为您可以从该类的方法访问类的私有成员,您可以对复制构造函数执行相同的操作(否则,您如何复制实例的状态)到了另一个班级?)。

答案 5 :(得分:1)

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

  

<强>私有;也就是说,它的名字只能由会员和朋友使用   声明它的类。

这意味着该类的任何成员都可以访问私人会员

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