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

2017-11-18  本文已影响0人  多宝鱼丁

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

不过实际用起来,我理解可以分成两种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;
}

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

小结一下:

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;
}

小结一下:

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片片,在儿子这里,就锁起来了吧!
小结一下

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;
}

再次小结一下

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

上一篇下一篇

猜你喜欢

热点阅读