LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 259|回复: 0

C++访问控制按类进行

[复制链接]
发表于 2024-1-10 22:28:24 | 显示全部楼层 |阅读模式
观察下面的程序:

#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是其他类型,那就另当别论了。

在需要从一个类的对象复制数据到同一个类的另外一个对象时,这个特性会变得非常有用。就在下一章讨论重载操作符<<来打印一个类的成员时,这个知识点我们会再次遇到。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表