|
观察下面的程序:
#include <iostream>
class DateClass // members are private by default
{
int m_month; // private by default, can only be accessed by other members
int m_day; // private by default, can only be accessed by other members
int m_year; // private by default, can only be accessed by other members
public:
void setDate(int month, int day, int year)
{
m_month = month;
m_day = day;
m_year = year;
}
void print()
{
std::cout << m_month << "/" << m_day << "/" << m_year;
}
// 看这里看这里
void copyFrom(const DateClass &d)
{
// 注意我们可以直接访问参数d的私有成员
m_month = d.m_month;
m_day = d.m_day;
m_year = d.m_year;
}
};
int main()
{
DateClass date;
date.setDate(10, 14, 2020); // okay, because setDate() is public
DateClass copy;
copy.copyFrom(date); // okay, because copyFrom() is public
copy.print();
return 0;
}
C++一个容易被忽视且误解的特性就是,访问控制作用于每个类,而不是每个对象(One nuance of C++ that is often missed or misunderstood is that access control works on a per-class basis, not a per-object basis.)。如果一个函数可以访问一个类的私有成员,那么这个函数就可以访问该类类型的任何对象的私有成员。
在上面的例子,copyFrom()是DateClass的一个成员,对DateClass的私有成员拥有访问权限。这意味着,copyFrom()不仅可以访问自身实例的私有成员,还可以访问参数d的私有成员!如果参数d是其他类型,那就另当别论了。
在需要从一个类的对象复制数据到同一个类的另外一个对象时,这个特性会变得非常有用。就在下一章讨论重载操作符<<来打印一个类的成员时,这个知识点我们会再次遇到。
|
|