2013-02-27 146 views
4

我在我们的使用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是私人会员。 如果它是私密的,这个构造函数如何访问通过的newListnbNodes

+0

你总是你自己最好的朋友:http://stackoverflow.com/a/437507/14065 – 2013-02-27 15:38:48

回答

7

有关私人成员的一个有趣的事情是,两个相同类型的对象可以自由访问其他私人成员。你可以把它想象成一个班级永远是朋友。由于这是ListDatanewlist的构造函数也是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愉快和轻松抢断f1secret,尽管它是私有的。

这个被允许的原因很简单,因为private并不意味着私人对象 - 它意味着私人的类。这简化了复制构造函数等功能的实现,这些构造函数需要对同一类的两个对象的内部进行一些工作。

规则来源于private定义(§11/ 1):

一个类的一个成员可以是

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

注意,它是在类的术语,而不是对象来定义。

+0

+1,我喜欢那个“朋友与自己”的比喻。 – juanchopanza 2013-02-27 14:31:46

+0

>>'同一类型的两个对象可以自由地访问其他私人成员'这个说法对我来说似乎不正确。 – 2013-02-27 14:43:15

+0

更好的说法是,一个班级的所有对象都是彼此的朋友。班级不需要与自己成为朋友。 – user93353 2013-02-27 14:43:32

5

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

3

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

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

1

会员有private能见度是只能成员函数相同类它们的成员的内上对象访问,而不限制构件。

如果功能f()C类的成员函数,它可以访问的private构件C任何实例,而不仅仅是那些由隐this指针(其中,当然,使得该有效static功能指出以及根本没有收到this指针)。

1

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

1

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

私人;也就是说,它的名字只能由其所在类的成员和朋友使用。

这意味着私有成员可以通过该类

这里ListData::ListData(const ListData& newlist)的任何成员访问是的ListData,这是一个成员函数,从而可以访问类的ListData的私有成员的拷贝构造函数。