在学习拷贝构造函数和重载=号实现深拷贝的时候,发现我们可以在待拷贝对象调用成员函数时,在此成员函数的内部可以直接使用参数对象的私有变量,
Class MyNum
{
public:
MyNum(int m, int n)
{
m_Num1 = m;
m_Num2 = n;
}
MyNum(const MyNum & mn)
{
//直接访问mn的私有变量
this->m_Num1 = mn.m_Num1;
this->m_Num2 = mn.m_Num2;
}
MyNum& operator=(const MyNum & mn)
{
this->m_Num1 = mn.m_Num1;
this->m_Num2 = mn.m_Num2;
}
private:
int m_Num1;
int m_Num2;
}
这时候产生疑惑,私有变量不是只有在成员函数内部才能使用吗?为什么不用set和get函数而可以直接访问,这时候写了下面的测试代码
#include <iostream>
using namespace std;
class MyNum
{
public:
MyNum(int m, int n)
{
m_Num1 = m;
m_Num2 = n;
}
void visitPrivateTest(MyNum &);
private:
int m_Num1;
int m_Num2;
};
void MyNum::visitPrivateTest(MyNum &p)
{
//类的成员函数可以访问同类型对象的私有变量,不针对对象
cout << "num1:" << p.m_Num1 << endl;
cout << "num2:" << p.m_Num2 << endl;
}
void test01()
{
MyNum p1(8, 9);
MyNum p2(1, 2);
p2.visitPrivateTest(p1);
}
int main()
{
test01();
return 0;
}
可以得到输出结果
可以看到通过对象p2调用成员函数的时候,正常访问了p1的私有变量
再看c++ primer中关于 private说明符的解释
我们知道类的成员函数是不占用对象的空间的,成员函数是属于类的,而不是属于变量,这也就是说,私有变量可以直接被类的成员函数访问,无论是通过哪个对象调用这个成员函数。
所以,通过一个对象调用成员函数时不能访问另一个对象的私有变量这种理解是错误的。