与复制构造函数和私有成员混淆

时间:2012-08-30 02:58:56

标签: c++

假设我有以下课程:

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,我的问题是关于复制构造函数,为什么我们可以使用{访问num的私有成员test {1}}初始化副本中的num?令我困惑的是,如果你键入num,当然这是错误的,因为你试图访问私有cout<<test.num<<endl,但如果你通过引用传递测试复制构造函数,它可以工作,可以有谁告诉我这里发生了什么?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

“私人”表示 - 只能在同一个班级内访问。

“protected”表示 - 可以从同一个类中访问,也可以从派生类中访问(在派生类中,受保护的非静态成员只能通过派生类类型的变量访问)。

“public”表示 - 可以通过任何方式访问。

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

答案 2 :(得分:1)

private并不意味着对象实例是私有的。它对于来说是私有的。类T的实例可以访问其他实例T的私有成员。同样,类T中的静态方法可以访问T实例的私有成员。

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