美文网首页
C++的关键字public,private和protected

C++的关键字public,private和protected

作者: 多宝鱼丁 | 来源:发表于2017-11-18 00:48 被阅读0次

    先写最基础的吧。
    C进入C++最先碰到的就是class,跟structure很像,但是一开始就多了几个关键字public,private和protected。
    下面就我目前自己的理解来说一说。
    这几个关键都是修饰class内部成员的访问权限,简单的理解就是:

    • 这些都是我的东西,你想要的话,是可以直接拿呢;还是需要我给你一把钥匙先?
    • 能直接拿的,那就是public成员。
    • 需要钥匙的,那就是private或者protected成员。

    不过实际用起来,我理解可以分成两种case:

    1. 声明class时,修饰内部成员属性

    看一段code:

    #include<iostream>
    #include<assert.h>
    using namespace std;
    class A{
    public:
        int a;
        A() {
            a1 = 1;
            a2 = 2;
            a3 = 3;
            a = 4;
        }
        void fun() {
            cout << a << endl;        //  在类内部访问,正确
            cout << a1 << endl;       //  内部访问,正确
            cout << a2 << endl;       //  内部访问,正确
            cout << a3 << endl;       //  内部访问,正确
        }
    public:
        int a1;
    protected:
        int a2;
    private:
        int a3;
    };
    int main() {
        A itema;
        itema.a = 10;       // 在类外部访问public成员a,正确
        itema.a1 = 20;      // 在类外部访问public成员a1,正确
        itema.a2 = 30;      // 在类外部访问protected成员a2,错误,类外不能访问protected成员
        itema.a3 = 40;      // 在类外部访问private成员a3,错误,类外不能访问private成员
        system("pause");
        return 0;
    }
    

    由注释可以看到,通过不同的关键字修饰的类成员,其访问权限就有了区别。

    小结一下:

    • public成员可以在类外部被访问。
    • private成员只属于类自己,外部想访问private成员,只能通过类方法。
    • protected成员目前的访问属性与private成员一样

    2. 类继承时,使基类成员属性在派生类中发生变化

    类如果不发生派生,好像就看不出protected和private的区别的,别慌,继续往下走。
    因为是3个关键字,所以就有了3种继承方式:

    2.1 public继承

    刚开始,我是我爸爸生的,我想各方面都跟我爹保持一致,我不想对父类的各个成员属性作任何改变,那么,我就用public继承。
    还是看code和注释一目了然:

    #include<iostream>
    #include<assert.h>
    using namespace std;
     
    class A {
    public:
        int a;
        A() {
            a1 = 1;
            a2 = 2;
            a3 = 3;
            a = 4;
        }
        void fun() {
              cout << a << endl;    // 访问public成员a,正确
              cout << a1 << endl;   // 访问public成员a1,正确
              cout << a2 << endl;   // 类成员函数访问protected成员a2,正确
              cout << a3 << endl;   // 类成员函数访问private成员a3,正确
        }
    public:
          int a1;
    protected:
          int a2;
    private:
          int a3;
    };
    
    // 类B public继承 类A,所以,B继承了A的成员a1,a2,属性也完全一样(注:B无法继承A的private成员a3)
    class B : public A {                 
    public:
          int a;
          B(int i) {
              A();
              a = i;
          }
          void fun() {
              cout << a << endl;        // 正确,访问自己的public成员
              cout << a1 << endl;       // 正确,基类的public成员,在派生类中仍是public成员。
              cout << a2 << endl;       // 正确,基类的protected成员,在派生类中仍是protected,并且可以被派生类访问。
              cout << a3 << endl;       // 错误,基类的private成员不能被派生类访问。(private成员只能由本类的成员访问)
          }
    };
    
    int main() {
        B b(10);
        cout << b.a << endl;
        cout << b.a1 << endl;   // 正确,类外可以访问b的public成员a1
        cout << b.a2 << endl;   // 错误,类外不能访问protected成员a2
        cout << b.a3 << endl;   // 错误,类外不能访问private成员
        system("pause");
        return 0;
    }
    

    小结一下:

    • public继承出来的派生类,基类的成员属性在派生类中不会发生任何变化。
    • 派生类无法访问基类的private成员。(我理解为:派生类无法继承基类的private成员,因此派生类就没有这个成员,自然也就无法访问)
    • 派生类可以继承基类的protected成员,并且在派生类中,仍然是protected属性。

    2.2 protected继承

    OK,龙生九子,总有熊孩子。虽然我是我爸爸生出来的,但我爸当年让你直接随便拿的一些东西(苍老师教学片),在我这儿,我不想让你直接取了(我要私藏起来,锁抽屉里,隐私,懂不懂!?),我想变一下,那咋办?
    那好办,C++就是这点好,你想要的,它都能给你 : )
    那我们就不public继承了嘛,关键字不是还有2个吗,protected也可以用?
    那当然了,请看code:

    #include<iostream>
    #include<assert.h>
    using namespace std;
    class A {
    public:
        int a;
        A() {
            a1 = 1;
            a2 = 2;
            a3 = 3;
            a = 4;
        }
        void fun() {
            cout << a << endl;    // 正确,自己的方法访问自己的成员
            cout << a1 << endl;   //正确
            cout << a2 << endl;   //正确
            cout << a3 << endl;   //正确
        }
    public:
        int a1;
    protected:
        int a2;
    private:
        int a3;
    };
    
    // B protected继承 A,那么A的public成员,在B中就“降级”变成protected,protected和private成员属性不变
    class B : protected A {
    public:
        int a;
        B(int i) {
            A();
            a = i;
        }
        void fun() {
            cout << a << endl;       //正确,B自己的public成员。
            cout << a1 << endl;       //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。
            cout << a2 << endl;       //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。
            cout << a3 << endl;       //错误,基类的private成员不能被派生类访问。
        }
    };
    
    int main() {
        B b(10);
        cout << b.a << endl;       //正确,对象b自己的的public成员a
        cout << b.a1 << endl;      //错误,b.a1这时候是protected属性,protected成员不能在类外访问。
        cout << b.a2 << endl;      //错误,protected成员不能在类外访问。
        cout << b.a3 << endl;      //错误,private成员不能在类外访问。
        system("pause");
        return 0;
    }
    

    你看,这样,爸爸的public片片,在儿子这里,就锁起来了吧!
    小结一下

    • protected继承出的派生类,基类的成员属性在派生类中会发生改变。
    • 基类的public成员,在派生类中被“降级”成protected。
    • 基类的protected成员,在派生类中仍然是protected。
    • 基类的private成员,派生类依然无法访问。

    2.3 private继承

    来到最后一个关键字private。
    没有最熊,只有更熊的娃。我爸让你能直接看的所有东西,现在到我这儿,对不起,我都不想再让你直接看了;并且,我还不想给我的儿子继承了!(苍老师只属于我,自己亲儿子也别想!)
    那要达到这样的效果,就需要private继承了。
    看code:

    #include<iostream>
    #include<assert.h>
    using namespace std;
    class A{
    public:
        int a;
        A() {
            a1 = 1;
            a2 = 2;
            a3 = 3;
            a = 4;
        }
        void fun() {
            cout << a << endl;    //正确
            cout << a1 << endl;   //正确
            cout << a2 << endl;   //正确
            cout << a3 << endl;   //正确
        }
    public:
        int a1;
    protected:
        int a2;
    private:
        int a3;
    };
    
    // B private继承 A,那么在B里,A的public和protected成员都变成了B的private成员
    class B : private A {
    public:
        int a;
        B(int i) {
            A();
            a = i;
        }
        void fun() {
            cout << a << endl;       //正确,内部访问public成员a。
            cout << a1 << endl;       //正确,基类public成员,在派生类中变成了private,可以被派生类访问。
            cout << a2 << endl;       //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。
            cout << a3 << endl;       //错误,基类的private成员不能被派生类访问。
        }
    };
    
    int main(){
      B b(10);
      cout << b.a << endl;       //正确。b.a是b的public成员
      cout << b.a1 << endl;      //错误,private成员不能在类外访问。
      cout << b.a2 << endl;      //错误, private成员不能在类外访问。
      cout << b.a3 << endl;      //错误,private成员不能在类外访问。
      system("pause");
      return 0;
    }
    

    再次小结一下

    • private继承后,基类的public和protected成员,在派生类里都被“降级”成private。
    • 访问派生类的private成员,自然遵循private规则。
    • 如果有派生类再派生“孙子”类,那么这个“孙子”类将无法访问“爷爷”类和“父亲”类中的任何private成员。

    好啦,今天就码到这里,第一次写技术文字,献丑献丑,有谬误之处,请不吝指教,多谢多谢~

    相关文章

      网友评论

          本文标题:C++的关键字public,private和protected

          本文链接:https://www.haomeiwen.com/subject/crysvxtx.html