1

假设我有以下课程:

class Test
{
             int num;
     public:
             Test(int x):num(x){}
             Test(const Test &rhs):num(rhs.num+1){}
};

int main()
{
      Test test(10);
      Test copy = test;
}

副本中的num应该是11,我的问题是关于副本构造函数内部,为什么我们可以访问using的私有成员num来初始化副本中的 ?令我困惑的是,如果您键入,当然这是错误的,因为您试图访问 private ,但是如果您通过引用复制构造函数通过测试,它可以工作,有人可以告诉我这里发生了什么吗? testnumnumcout<<test.num<<endlnum

4

3 回答 3

6

私有成员是类本身的私有成员,而不是类的实例。

于 2012-08-30T03:01:55.257 回答
3

访问限制是针对每个类的,而不是针对每个对象的。

“私有”的意思是——只能从同一个类中访问。

“受保护”的意思是——可以从同一个类中访问,也可以从派生类中访问(在派生类中,受保护的非静态成员只能通过具有派生类类型的变量访问)。

“公共”的意思是——任何东西都可以访问。

访问点限制是限制必须检查的代码区域,以便了解值的使用位置,而不是阻止代码使用这些值。

于 2012-08-30T03:02:21.177 回答
1

private并不意味着对象实例私有。这意味着该类的私有。一个类的实例T可以访问其他实例的私有成员T。类似地,类中的静态方法T可以访问T.

如果private仅限制对单个实例的访问,它将使对象不可复制,因为正如您所指出的,复制构造函数将无法从原始实例中读取数据。

于 2012-08-30T03:04:52.057 回答