假设我有以下课程:
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
,但如果你通过引用传递测试复制构造函数,它可以工作,可以有谁告诉我这里发生了什么?
答案 0 :(得分:5)
私有成员对类本身是私有的,而不是类的实例。
答案 1 :(得分:3)
访问限制是每个类,而不是每个对象。
“私人”表示 - 只能在同一个班级内访问。
“protected”表示 - 可以从同一个类中访问,也可以从派生类中访问(在派生类中,受保护的非静态成员只能通过派生类类型的变量访问)。
“public”表示 - 可以通过任何方式访问。
访问限制的目的是限制必须检查的代码区域,以便了解值的使用位置,而不是阻止代码使用这些值。
答案 2 :(得分:1)
private
并不意味着对象实例是私有的。它对于类来说是私有的。类T
的实例可以访问其他实例T
的私有成员。同样,类T
中的静态方法可以访问T
实例的私有成员。
如果private
仅限制对单个实例的访问,则会使对象不可复制,因为正如您所指出的,复制构造函数将无法从原始实例读取数据。