C++:C++中public protected private关键字用法
C++:C++中public protected private關鍵字用法
筆者這里主要針對C++中public protected private關鍵字做一個較全面的總結。首先public protected private關鍵字用于訪問控制的,也被稱為訪問說明符。
主要用途有2種。
- 用法1:在class類(含struct結構體,struct在C++中是所有成員都公開的類)中 作為成員變量/成員函數的修飾符。
- 用法2:在C++的繼承體系中作為從繼承修飾符使用。
下面我們分開進行介紹。
在class類中
在class類中作為其成員的訪問控制說明符。
在class中默認使用private訪問說明符,除非指定特定訪問說明符。離成員往上最近的即為該成員的訪問說明符,如果沒有訪問說明符 則使用默認訪問說明符private。
在struct中所有成員默認使用public訪問說明符,除非指定特定訪問說明符。離成員往上最近的即為該成員的訪問說明符,如果沒有訪問說明符 則使用默認訪問說明符public。
在class/struct中的成員如果為public修飾,該成員可在其他任何作用域內被訪問到。protected和private 在當前class范圍外不可訪問(繼承體現中另當別論,見下章節),除非友元。
舉例如下:
#include <iostream> using namespace std;class A {// 沒有訪問說明符,則使用默認訪問說明符privatevoid fun1(){cout << "A:fun1()" << endl; };int m1;public:fun2(){cout << "A:fun2()" << endl; };int m2;protected:fun3(){cout << "A:fun3()" << endl; };int m3;private:fun4(){cout << "A:fun4()" << endl; };int m4;// 友元函數,可為普通全局函數 也可為class成員函數 friend void friendFun1(); }; struct B {// 沒有訪問說明符,則使用默認訪問說明符publicvoid fun1(){cout << "B:fun1()" << endl; };int m1;public:fun2(){cout << "B:fun2()" << endl; };int m2;protected:fun3(){cout << "B:fun3()" << endl; };int m3;private:fun4(){cout << "B:fun4()" << endl; };int m4; }; // 友元函數,都成為某個class的朋友了,當然無話不談了,class類中的所有成員亦可訪問。 void friendFun1() {cout << "===friendFun1 begin===" << endl;A a; a.fun1(); // oka.fun2(); // oka.fun3(); // oka.fun4(); // okcout << "===friendFun1 end===" << endl; }int main(int argc,char* argv[]) {A a; // a.fun1(); // 編譯errora.fun2(); // ok ,class之外的作用域可訪問public成員, // a.fun3(); // 編譯error // a.fun4(); // 編譯errorfriendFun1(); // ok, class的友元函數 所有成員亦可訪問。 return 0; }在繼承體系中
這里直接說結論了。
-
class省略繼承訪問說明符,默認為private私有繼承
-
struct省略繼承訪問說明符,默認為public公有繼承
-
public公開繼承:基類的所有公開成員可作為派生類的公開成員訪問,基類的所有受保護成員可作為派生類的受保護成員訪問(基類的私有成員始終不可訪問,除非設為友元)。
-
protected受保護繼承:基類的所有公開和受保護成員可作為派生類的受保護成員訪問(基類的私有成員始終不可訪問,除非設為友元)
-
private私有繼承:基類的所有公開和受保護成員可作為派生類的私有成員訪問(基類的私有成員始終不可訪問,除非設為友元)
舉例如下:
#include <iostream> using namespace std;class Base {public:void fun1(){cout << "Base:fun1()" << endl; };int m1;protected:fun2(){cout << "Base:fun2()" << endl; };int m2;private:fun3(){cout << "Base:fun3()" << endl; };int m3; };// class省略繼承訪問說明符,默認為private繼承 class A:Base {public:void Fun1(){cout << "A:Fun1()" << endl; } protected:void Fun2(){cout << "A:Fun2()" << endl; } private:void Fun3(){cout << "A:Fun3()" << endl; } }; // struct省略繼承訪問說明符,默認為public繼承 struct B:Base {public:void Fun1(){cout << "B:Fun1()" << endl; } protected:void Fun2(){cout << "B:Fun2()" << endl; } private:void Fun3(){cout << "B:Fun3()" << endl; } };/* public公開繼承 基類的所有公開成員可作為派生類的公開成員訪問, 基類的所有受保護成員可作為派生類的受保護成員訪問 (基類的私有成員始終不可訪問,除非設為友元) */ class C:public Base {public:void Fun1(){cout << "C:Fun1()" << endl; } protected:void Fun2(){cout << "C:Fun2()" << endl; } private:void Fun3(){cout << "C:Fun3()" << endl; } }; /* protected保護繼承 基類的所有公開和受保護成員可作為派生類的受保護成員訪問 (基類的私有成員始終不可訪問,除非設為友元) */ class D:protected Base {public:void Fun1(){cout << "D:Fun1()" << endl; } protected:void Fun2(){cout << "D:Fun2()" << endl; } private:void Fun3(){cout << "D:Fun3()" << endl; } }; /* private私有繼承 基類的所有公開和受保護成員可作為派生類的私有成員訪問 (基類的私有成員始終不可訪問,除非設為友元) */ class E:private Base {public:void Fun1(){cout << "E:Fun1()" << endl; } protected:void Fun2(){cout << "E:Fun2()" << endl; } private:void Fun3(){cout << "E:Fun3()" << endl; } }; int main(int argc,char* argv[]) { // B和C都是 public公有繼承,其父類公有成員將成為子類公有成員,父類受保護成員也將成為子類受保護成員 B b; C c; b.fun1(); // okc.fun1(); // ok// A和E都是 private私有繼承,其父類的 公有成員和 受保護成員, 都將成為子類的 私有成員A a;E e; // a.fun1(); // 編譯error // e.fun1(); // 編譯error// D 為protected受保護繼承, 其父類的 受保護成員將成為 子類受保護成員 D d; // d.fun1(); // 編譯error return 0; }總結
以上是生活随笔為你收集整理的C++:C++中public protected private关键字用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nvidia Jetson TX2入门指
- 下一篇: python2 安装 pip