OOP的三大特色:『繼承,封裝,多型』,C++使用了4個class access label實踐封裝:『public、protected、private、friend』。

4個access label的使用時機如下:
public:當資料可以給user、自己和derived class存取時使用。
protected:當資料不可以給user存取,只能給自己和derived class存取時使用。

private:當資料不可以給user和derived class使用,只可以給自己存取時使用。

friend:指定一個global function可存取private資料。

其中較難理解的是friend,這在其他語言都沒有,其實friend在C++也只用在operator overloading,其他地方則不應該使用,因為違反了OOP封裝的原則。

以下範例demo四種class access label的用法:

 1/**//* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : ClassAccessLabel.cpp
 5Compiler    : Visual C++ 8.0 / ISO C++
 6Description : Demo class access label
 7Release     : 01/23/2007 1.0
 8*/
 9#include <iostream>
10
11using namespace std;
12
13class Student {
14// private :
15protected: // must use protected to allow derived class to access.
16  int studentNo;
17protected:
18  Student(int studentNo = 0) : studentNo(studentNo) {}
19public:
20  friend ostream& operator<<(ostream&, const Student&); // use global function
21};
22
23class Bachelor : public Student {
24public:
25  Bachelor(int studentNo = 0) : Student(studentNo) {} // Call base class constructor
26public:
27  int getStudentNo() {
28     return this->studentNo;
29  }
30};
31
32ostream& operator<<(ostream& out, const Student& student) {
33  out << student.studentNo << endl;
34
35  return out;
36}
37
38
39int main() {
40  Bachelor John(123456);
41  cout << John.getStudentNo() << endl;
42  cout << John << endl;
43}

執行結果

123456
123456

程式的架構Student為ABC,Bachelor繼承了Student,studentNo為學號,若使用了14行的private,則Bachelor::getStudentNo()將無法存取studentNo,必須改成15行的protected,而constructor和member function,因為本來就是要給user存取的,所以放在public,比較特別的是18行Student的Constructor放在protected,因為Student為ABC,不能被建立成object,所以constructor不應該為public,只要是protected供derived class呼叫即可,當然寫成public也不會造成程式錯誤。

20行的friend,主要是operator overloading給<<使用,因為是global function,又要讓<<存取private data,只好宣告此global function為friend,再次強調,C++應該只在operator overloading使用friend,其他地方亂使用都會違反OOP的封裝原則。

(原創) C++的4個Class Access Label (C/C++)相关推荐

  1. (原創) 如何將編譯結果,統一放在一個目錄下? (SOC) (Quartus II)

    Abstract Quartus II預設會將所有檔案都放在project的根目錄下,導致根目錄檔案過多,管理不便,若能將編譯的結果統一放到其他目錄下,將有助於日後管理. Introduction 使 ...

  2. (原創) 如何一個字元一個字元的印出字串? (C/C++) (C)

    Abstract 若只能一個位元一個位元的印出字串,你會怎麼印呢? Introduction 我同學要將字串送到硬體,但硬體所提供的API,一次只能送一個字元,在這裡我們模擬這個情境,一個字元一個字元 ...

  3. (原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)

    Abstract Verilog雖然為硬體描述語言,亦提供讀取/寫入文字檔的功能. Introduction為什麼需要用Verilog讀取/寫入文字檔呢?主要用在寫Testbench,並且有兩個優點: ...

  4. (原創) 如何自行在ThinkPad X61安裝Windows XP Professional SP3? (NB) (ThinkPad) (X61) (OS) (Windows)...

    Abstract 新一代的ThinkPad X61都已經安裝了Windows Vista,或許你因為各種理由想自己重新安裝Windows XP,並且升上SP3,本文是我的安裝心得. Introduct ...

  5. (原創) ThinkPad X61安裝過程全紀錄 (NB) (ThinkPad) (X61)

    Abstract 我的ThinkPad X61安裝過程詳細紀錄. Introduction Step 1: ThinkPad X61基本硬體 (原創) 如何自行在ThinkPad X61安裝Windo ...

  6. (原創) 我的Design Pattern之旅[3]:使用template改進Strategy Pattern (OO) (Design Pattern) (C/C++) (template)...

    在strategy pattern中,為了讓各strategy能方便存取原來物件的所有public member function,我們常用*this將整個物件傳給各strategy,這樣的設計並沒有 ...

  7. (原創) 如何將CMOS所擷取的影像傳到PC端? (SOC) (DE2) (TRDB-DC2)

    AbstractDE2提供了Control Panel與Image Converter,可以將CMOS所擷取的影像傳到PC端, Introduction 版權聲明:文中所有範例皆出自DE2光碟,版權歸 ...

  8. (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)

    Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL) 曾經討論過for_each(),不過當時功力尚淺,只談到了皮毛而已,這次看了effect ...

  9. (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)

    大家都體會過sequential container搭配copy() algorithm,只要一行程式就可以將所有值輸出到cout,map這種associative container就無法用這一招, ...

  10. (原創) array可以使用reference方式傳進function嗎? (C/C++)

    任何型態皆可用C++新提出的reference傳進function,array除了使用pointer方式傳進function外,當然也可以使用reference. 當使用pointer傳進functi ...

最新文章

  1. Nat. Mach. Intell. | 基于神经网络的迁移学习用于单细胞RNA-seq分析中的聚类和细胞类型分类...
  2. matplotlib学习日记(九)-图形样式
  3. crontab 半小时_?用猫粮诱惑,7名消防员花半小时救出困在夹墙间的喵星人
  4. 好看的html导航栏作品,精选10款超酷的HTML5/CSS3菜单
  5. 启明云端分享| RK3568核心板到底有哪些吸引眼球的地方呢
  6. Spring容器和springmvc容器的区别联系
  7. solaris11-text-安装GUI(gnome)
  8. ubuntu 安装deb程序文件失败的解决方法
  9. NOTEBOOK随笔
  10. 切单个图标为背景透明的方法
  11. 【学习 Opencv】—— 访问摄像机和视频
  12. Win7上USB转串口芯片ch341驱动安装方法
  13. 员工新参(北京)社保所需材料
  14. 调通sina33下的AP6212A0版本的BT(V1.0)
  15. 2013年04月12日 JavaEE+物联云计算就业班-上海
  16. 红胖子创业一年整总结:前二十年题记,萌芽初期,外包初期,创业初期,未来规划
  17. Java工程师成神之路 | 2020正式版
  18. 60、JAVA的map集合
  19. 新IT云领未来 新华三Navigate 2017开启数字时代新引擎
  20. [bzoj4833][数论][min-max容斥]最小公倍佩尔数

热门文章

  1. 实时计算在贝壳的实践
  2. java action文件下载_java和Struts2实现文件下载和上传详解
  3. arcgis中dem坐标定义_ArcGIS中的地理坐标系转换方法参数(二) | 学步园
  4. websocket动态添加广播路径_数据可视化WebSocket实现聊聊我的实现思路
  5. html实现点击切换页面,JavaScript实现的简单Tab点击切换功能示例
  6. 第一个被赋予公明身份的机器人_机器人索菲亚扬言要消灭人类!曾经狂妄无比,现在过得如何...
  7. 学生选课系统代码-4c【interface】视图层代码【MVC--c】代码
  8. pythonATM,购物车项目实战_补充4-db模块
  9. golang 语言中关于err的函数的封装使用
  10. linux lsnrctl命令不存在,linux – oracle lsnrctl TNS-12545:连接失败,因为目标主机或对象不存在...