C ++ - 为什么可以在Copy Constructor中直接访问传递的对象的私有变量?

时间:2018-02-19 07:43:14

标签: c++ class c++11 private copy-constructor

class IntVec
{
public:
     IntVec();
     IntVec(int siz);
     IntVec(const IntVec& temp);

     ~IntVec();

private:
       int* arr;

       int size;
};

IntVec::IntVec()
{
    size = 2;

    arr = new int[size]; 
}

IntVec::IntVec(int siz)
{
    size = siz;

    arr = new int[size];
}

IntVec::IntVec(const IntVec& temp)
{
    size = temp.size; // Why does this not cause an error?  size is a private variable of object temp.

    arr = new int[size];

    for (int i = 0; i < size; i++)
    {
        arr[i] = temp.arr[i]; // Why doesn't this cause an error?  arr is a private variable of object temp.
    }
}

IntVec::~IntVec()
{
    delete[] arr;
}

int main()
{
    IntVec test1(2);

    cout << test1.size; // Causes error (expected), since size is private.
}

我不清楚为什么我可以在复制构造函数中访问temp的大小和arr变量,因为它们是私有变量。为什么我在main()中遇到错误是有道理的,但我不确定为什么我在Copy Constructor中没有出错。

4 个答案:

答案 0 :(得分:2)

这是因为public / protected / private引用了类而不是单个对象。因此,类中的所有对象以及静态方法都可以访问每个内部。

答案 1 :(得分:2)

size = temp.size; // Why does this not cause an error?  size is a private variable of object temp.

您误解了访问规则。

访问规则不适用于每个对象。

它们适用于类型和功能。

temp的类型为IntVec。可以在IntVec的任何成员函数中访问IntVec类型的对象的任何成员。

其他类的非成员函数和成员函数将无法访问private类型对象的IntVec成员。

答案 2 :(得分:1)

私有成员有类范围的意思可以直接在类里面使用,你不能直接使用类外的私有成员,因为复制构造函数是在类里面你可以访问私有成员

答案 3 :(得分:0)

这是因为access specifiers是有效的每个类,而不是每个对象。因此,类方法可以访问类的任何实例的私有成员。

  

类的所有成员(成员函数体,成员对象的初始值设定项和整个嵌套类定义)可以访问类可以访问的所有名称。 / strong>成员函数中的本地类可以访问成员函数本身可以访问的所有名称。