5

我在使用 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传递的?newList

4

6 回答 6

10

关于私有成员的一个有趣的事情是相同类型的两个对象可以自由地访问彼此的私有成员。你可以把它想象成一个类总是与自己成为朋友。由于 this 是ListData并且newlist也是 a的构造函数ListData,因此您可以很好地访问其私有内容。

这是一个例子

#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尽管它是私人的,但愉快而轻松地窃取了secretfrom 。f1

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

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

一个类的成员可以是

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

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

于 2013-02-27T14:28:33.297 回答
6

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

于 2013-02-27T14:27:56.987 回答
4

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

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

于 2013-02-27T14:28:06.050 回答
2

具有private可见性的成员是只能在它们所属的同一类的成员函数中访问的成员,对对象没有限制。

如果 functionf()是 class 的成员函数C,它可以访问 的任何实例的private成员,而不仅仅是隐式指针指向的那些成员(当然,这也使得这对于根本不接收指针的函数也有效) .Cthisstaticthis

于 2013-02-27T14:28:08.227 回答
2

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

于 2013-02-27T14:29:23.710 回答
2

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

私人; 也就是说,它的名称只能被声明它的类的成员和朋友使用。

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

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

于 2013-02-27T14:37:58.530 回答