我在使用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}}?
答案 0 :(得分:8)
关于私有成员的一个有趣的事情是,两个相同类型的对象可以自由地访问彼此的私有成员。你可以把它想象成一个班级总是与自己的朋友。由于这是ListData
的构造函数,newlist
也是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
快乐轻松地从secret
窃取f1
,尽管它是私密的。
允许这样做的原因很简单,因为private
并不意味着对象是私有的 - 它对于一个类来说是私有的。这简化了复制构造函数的实现,这些函数需要对同一类的两个对象的内部进行一些工作。
该规则来自private
(§11/ 1)的定义:
班级的成员可以是
private
;也就是说,它的名称只能由声明它的类的成员和朋友使用。- [...]
请注意,它是根据类而非对象定义的。
答案 1 :(得分:5)
private
关键字具有类语义而非对象语义。因此,类的对象的私有成员可以被同一类的其他对象访问。
答案 2 :(得分:3)
nbNodes
对ListData
类是私有的,而不是该类的特定实例。因此,在类的代码中,您可以看到该类的其他实例的私有数据。
如果不是这样,每个类都必须为每个数据成员导出“getters”,以便执行复制构造和复制分配。
答案 3 :(得分:1)
具有private
可见性的成员是只能在其成员所属的类的成员函数中访问的成员,而不受的限制对象。
如果函数f()
是类C
的成员函数,则它可以访问任何 private
实例的C
成员,而不是只是那些由隐式this
指针指向的指针(当然,这使得它对static
函数也有效,它们根本没有收到this
指针。
答案 4 :(得分:1)
复制构造函数就像任何其他方法一样:因为您可以从该类的方法访问类的私有成员,您可以对复制构造函数执行相同的操作(否则,您如何复制实例的状态)到了另一个班级?)。
答案 5 :(得分:1)
从C ++标准,第11章:成员访问控制:
<强>私有强>;也就是说,它的名字只能由会员和朋友使用 声明它的类。
这意味着该类的任何成员都可以访问私人会员
这里ListData::ListData(const ListData& newlist)
是ListData的复制构造函数,它是一个成员函数,因此可以访问类ListData的私有成员。