对于初学者C++的属性控制以及继承属性还是比较那掌握的,笔者在这里总结一下自己学习这些过程的见解。首先我们来看:


    1、C++支持的访问属性有public、protected、private,下来我浅谈一下我在学习过程中的一些领悟。

            1、对于public

                    1、该类中的函数、子类中的函数、其友元函数的访问以及该类中的对象

                    2、我个人一直觉得用代码理解概念是一个很好的方法,下边我将给出一些我的测试用例:

class Base
{
public:
    //友元函数
    friend void friend_Show(Base &bb);
public:
    Base():x(0),px(0){ }
    ~Base(){ }
public:
    //公有属性
    int px;
    void ShowBase()
    {
        cout<<"I am Show Base and am public"<<endl;
    }
    void Test()
    {
        cout<<"I am Test"<<endl;
        //测试保护方法调用公有方法成功了吗
        Print();
        //测试公有属性可以被保护方法修改吗
        cout<<"px = "<<px<<endl;
        //测试私有方法调用公有方法
         Print_Private();
        //测试私有方法修改公有属性
         cout<<"px = "<<px<<endl;
        
    }
protected:
    void Print()
    {
        cout<<"I am Print "<<endl;
        //公有方法被保护成员访问
         ShowBase();
         //保护方法修改公有属性
         px = 10; 
    }
private:
    void Print_Private()
    {
        cout<<"I am Pint_Private"<<endl;
        //公有成员被私有成员访问
        ShowBase();
         //私有方法修改公有属性
         px = 20;
    }
private:
    int x;

};
void friend_Show(Base &bb)
{
    cout<<"I am friend_Show"<<endl;
    //友元方法访问公有属性
    bb.px= 30;
    ////友元方法访问公有方法
    bb.ShowBase();

}
void main()
{
    Base bb;
    bb.Test();
    //测试友元方法方法公有属性和方法
     friend_Show(bb);
     cout<<"bb.px = "<<bb.px<<endl;

}

运行结果:

图片.png

        上边的测试代码我给出了尽可能多注释,验证了上边几个属性,除了子类中的函数的访问属性没有给出测试用例,其他的都给出了测试用例。子类中的函数的访问属性我下边将作为一个专门的模块总结。


         2、对于ptotected

               1、可以被类中的函数、子类中的函数、其友元函数、该类的对象访问

               2、这里我同样给出测试代码:

class Base
{
public:
    //友元函数
    friend void friend_Show(Base &bb);
public:
    Base():x(0),pp(0)  {   }
    ~Base()    {    }
public:
    void ShowBase()
    {
        cout<<"I am Show Base and am public"<<endl;
        //调用保护属性
        Print();
        //修改保护属性
        pp = 40;
    }

    void Test()
    {
        cout<<"I am Test"<<endl;
        //测试保护方法调用保护方法
        Test_proteced();
        //测试公保护方法修改保护属性
        cout<<"pp = "<<pp<<endl;
        //测试私有方法调用保护方法
         Print_Private();
        //测试私有方法修改保护属性
         cout<<"pp = "<<pp<<endl;
         //测试公有方法调用保护方法
          ShowBase();
        //测试公有方法修改保护属性
          cout<<"pp = "<<pp<<endl;
        
    }

    void TestFriend()
    {
        cout<<"I am TestFriend"<<endl;
         cout<<"pp = "<<pp<<endl;
    }
protected:
    int pp;
    void Print()
    {
        cout<<"I am Print and am protected "<<endl;
    }

    void Test_proteced()
    {
        cout<<"I am Test_proteced "<<endl;
        //测试保护方法调用
        Print();
        pp = 50;
    }
private:
    void Print_Private()
    {
        cout<<"I am Pint_Private"<<endl;
        //公有成员被私有成员访问
        Print();
        //私有方法修改保护属性
        pp = 60;
    }
private:
    int x;

};



void friend_Show(Base &bb)
{
    cout<<"I am friend_Show"<<endl;
    //友元方法访问保护属性
    bb.pp= 30;
    ////友元方法访问保护方法
    bb.Print();
    

}

void main()
{
    Base bb;
    bb.Test();
    //测试友元方法方法公有属性和方法
     friend_Show(bb);
     bb.TestFriend();

}

运行结果:

        图片.png


        同样我在代码中给出了尽可能详尽的注释,对除了子函数中的访问没有给出,子函数的访问权限后边我将作为一个专门的模块总结。


                3、对于private修饰符

                    1、只能有该类中的函数以及其友元函数访问,不能被任何其他函数和对象访问。

                    2、同样我也给出测试代码:

class Base
{
public:
    //友元函数
    friend void friend_Show(Base &bb);
public:
    Base():x(0)  {  }
    ~Base()   {    }
public:
    void ShowBase()
    {
        cout<<"I am Show Base and am public"<<endl;
        //调用私有属性
        Print_Private();
        //修改私有属性
        x = 200;
    }

    void Test()
    {
        cout<<"I am Test"<<endl;
        //测试公有方法调用保护方法
        ShowBase();
        //测试公有方法修改私有属性
        cout<<"x = "<<x<<endl;
        //测试保护方法调用私有方法
         Print();
        //测试保护方法修改私有属性
         cout<<"x = "<<x<<endl;
         //测试私有方法调用私有方法
         Test_Private();
         //测试是由私有方法修改私有属性
         cout<<"x = "<<x<<endl;    
    }
    void TestFriend()
    {
        cout<<"I am TestFriend"<<endl;
         cout<<"x = "<<x<<endl;
    }
protected:
    void Print()
    {
        cout<<"I am Print and am protected "<<endl;
        //测试访问私有属性的方法
        Print_Private();
        //测试调用属性的属性
        x = 100;
    }
private:
    void Print_Private()
    {
        cout<<"I am Pint_Private"<<endl;
    }

    void  Test_Private()
    {
        cout<<"I am Test_priavate"<<endl;
        Print_Private();
    }
private:
    int x;

};

void friend_Show(Base &bb)
{
    cout<<"I am friend_Show"<<endl;
    //友元方法访问私有属性
    bb.x= 300;
    ////友元方法访问私有方法
    bb.Print_Private();
    

}

void main()
{
    Base bb;
    bb.Test();
    //测试友元方法方法公有属性和方法
     friend_Show(bb);
     bb.TestFriend();

}

运行结果:

图片.png

        最后也同样给出了privete访问控制测试代码以及截图,验证了我上边给出的访问控制权限。


    限于篇幅这里只给出了基本的访问控制权限,没有给出子类中的访问控制权限测试案例,以及规律,子类中访问控制权限我将在下一篇的博文中给出。