概述

c++ 使用public、protected、private三个关键字来控制类的成员变量、成员函数的访问权限(也可以称为可见性),它们三者的用法规则如下:

  • public:被声明为public的成员变量、成员函数可以被类中成员函数、子类中的成员函数、友元函数、友元类、类的对象访问;
  • protected:被声明为protected的成员变量、成员函数可以被类中成员函数、子类中的成员函数、友元函数、友元类访问,不能被类的对象访问;
  • private:被声明为private的成员变量、成员函数可以被类中的成员函数、友元函数、友元类访问,不能被子类的成员函数、类/子类对象访问。

用法

#include <iostream>

using namespace std;

class Base
{
    public:
        int a = 1;
        void fun1() {};
    protected:
        int b = 2;
        void fun2() {};
    private:
        int c = 3;
        void fun3() {};

    friend void friendFun(Base b); // 定义一个Base类的友元函数
    friend class FriendTest;
};

class SubBase : public Base
{
    public:
        void test() 
        {
            cout << a << endl;
            cout << b << endl;
            // cout << c << endl; c是定义为private的变量无法访问,编译过不去
            fun1();
            fun2();
        }
};

class FriendTest
{
    /* 在友元类中可以访问Base类中的所有成员、函数 */
    public:
        void fun4(Base b)
        {
        cout << b.a << endl;
        cout << b.b << endl;
        cout << b.c << endl;

        b.fun1();
        b.fun2();
        b.fun3();
        }
};

void friendFun(Base b)
{
    /* 在友元函数中可以访问Base类中的所有成员、函数 */
    cout << b.a << endl;
    cout << b.b << endl;
    cout << b.c << endl;

    b.fun1();
    b.fun2();
    b.fun3();
}

int main(void)
{
    SubBase s;

    s.test();
    // cout << s.b << endl; b是定义为protected的变量,不能用变量去访问,编译过不去
    s.fun1();
    // s.fun2(); fun2是定义为protected的函数,不能用变量去访问,编译过不去

    return 0;
}

总结

  • 类本身和友元是可以访问声明为public、protected、private的所有成员函数和成员变量的;
  • 访问控制关键字只有public、protected、private三种,如果没有声明,那么默认就是private;
  • public、protected、private三种关键字可以在一个类中出现多次,其范围为从该关键字开始到下一个关键字开始,一般默认一种写一个就行。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐