(原創) C++的4個Class Access Label (C/C++)
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的用法:
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
程式的架構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++)相关推荐
- (原創) 如何將編譯結果,統一放在一個目錄下? (SOC) (Quartus II)
Abstract Quartus II預設會將所有檔案都放在project的根目錄下,導致根目錄檔案過多,管理不便,若能將編譯的結果統一放到其他目錄下,將有助於日後管理. Introduction 使 ...
- (原創) 如何一個字元一個字元的印出字串? (C/C++) (C)
Abstract 若只能一個位元一個位元的印出字串,你會怎麼印呢? Introduction 我同學要將字串送到硬體,但硬體所提供的API,一次只能送一個字元,在這裡我們模擬這個情境,一個字元一個字元 ...
- (原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)
Abstract Verilog雖然為硬體描述語言,亦提供讀取/寫入文字檔的功能. Introduction為什麼需要用Verilog讀取/寫入文字檔呢?主要用在寫Testbench,並且有兩個優點: ...
- (原創) 如何自行在ThinkPad X61安裝Windows XP Professional SP3? (NB) (ThinkPad) (X61) (OS) (Windows)...
Abstract 新一代的ThinkPad X61都已經安裝了Windows Vista,或許你因為各種理由想自己重新安裝Windows XP,並且升上SP3,本文是我的安裝心得. Introduct ...
- (原創) ThinkPad X61安裝過程全紀錄 (NB) (ThinkPad) (X61)
Abstract 我的ThinkPad X61安裝過程詳細紀錄. Introduction Step 1: ThinkPad X61基本硬體 (原創) 如何自行在ThinkPad X61安裝Windo ...
- (原創) 我的Design Pattern之旅[3]:使用template改進Strategy Pattern (OO) (Design Pattern) (C/C++) (template)...
在strategy pattern中,為了讓各strategy能方便存取原來物件的所有public member function,我們常用*this將整個物件傳給各strategy,這樣的設計並沒有 ...
- (原創) 如何將CMOS所擷取的影像傳到PC端? (SOC) (DE2) (TRDB-DC2)
AbstractDE2提供了Control Panel與Image Converter,可以將CMOS所擷取的影像傳到PC端, Introduction 版權聲明:文中所有範例皆出自DE2光碟,版權歸 ...
- (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
Abstract之前在(原創) 如何使用for_each() algorithm? (C/C++) (STL) 曾經討論過for_each(),不過當時功力尚淺,只談到了皮毛而已,這次看了effect ...
- (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)
大家都體會過sequential container搭配copy() algorithm,只要一行程式就可以將所有值輸出到cout,map這種associative container就無法用這一招, ...
- (原創) array可以使用reference方式傳進function嗎? (C/C++)
任何型態皆可用C++新提出的reference傳進function,array除了使用pointer方式傳進function外,當然也可以使用reference. 當使用pointer傳進functi ...
最新文章
- Nat. Mach. Intell. | 基于神经网络的迁移学习用于单细胞RNA-seq分析中的聚类和细胞类型分类...
- matplotlib学习日记(九)-图形样式
- crontab 半小时_?用猫粮诱惑,7名消防员花半小时救出困在夹墙间的喵星人
- 好看的html导航栏作品,精选10款超酷的HTML5/CSS3菜单
- 启明云端分享| RK3568核心板到底有哪些吸引眼球的地方呢
- Spring容器和springmvc容器的区别联系
- solaris11-text-安装GUI(gnome)
- ubuntu 安装deb程序文件失败的解决方法
- NOTEBOOK随笔
- 切单个图标为背景透明的方法
- 【学习 Opencv】—— 访问摄像机和视频
- Win7上USB转串口芯片ch341驱动安装方法
- 员工新参(北京)社保所需材料
- 调通sina33下的AP6212A0版本的BT(V1.0)
- 2013年04月12日 JavaEE+物联云计算就业班-上海
- 红胖子创业一年整总结:前二十年题记,萌芽初期,外包初期,创业初期,未来规划
- Java工程师成神之路 | 2020正式版
- 60、JAVA的map集合
- 新IT云领未来 新华三Navigate 2017开启数字时代新引擎
- [bzoj4833][数论][min-max容斥]最小公倍佩尔数
热门文章
- 实时计算在贝壳的实践
- java action文件下载_java和Struts2实现文件下载和上传详解
- arcgis中dem坐标定义_ArcGIS中的地理坐标系转换方法参数(二) | 学步园
- websocket动态添加广播路径_数据可视化WebSocket实现聊聊我的实现思路
- html实现点击切换页面,JavaScript实现的简单Tab点击切换功能示例
- 第一个被赋予公明身份的机器人_机器人索菲亚扬言要消灭人类!曾经狂妄无比,现在过得如何...
- 学生选课系统代码-4c【interface】视图层代码【MVC--c】代码
- pythonATM,购物车项目实战_补充4-db模块
- golang 语言中关于err的函数的封装使用
- linux lsnrctl命令不存在,linux – oracle lsnrctl TNS-12545:连接失败,因为目标主机或对象不存在...