C++ 中封裝的含義和簡(jiǎn)單實(shí)現(xiàn)方式
其實(shí)封裝并不是編程中的一個(gè)思想,對(duì)于很多領(lǐng)域來(lái)說(shuō)都是這樣。對(duì)于電子器件來(lái)說(shuō),我們不關(guān)心其內(nèi)部的結(jié)構(gòu),只在乎該器件能夠?qū)崿F(xiàn)什么樣的功能。這樣對(duì)于顧客來(lái)說(shuō),不用花時(shí)間研究?jī)?nèi)部的實(shí)現(xiàn)過(guò)程,而對(duì)于商家來(lái)說(shuō),也可以更好的保護(hù)它們的商業(yè)秘密。
而對(duì)于 C++ 來(lái)說(shuō)也是這樣,借由數(shù)據(jù)類(lèi)型也可以實(shí)現(xiàn)封裝。這樣做的好處就是對(duì)外屏蔽了功能實(shí)現(xiàn),對(duì)內(nèi)開(kāi)放了數(shù)據(jù)權(quán)限。
C++ 中的類(lèi)和對(duì)象是經(jīng)由 C 中的 struct 發(fā)展而來(lái)的,就好像 struct 是由數(shù)組發(fā)展而來(lái)的一樣。因此我們可以先通過(guò) struct 實(shí)現(xiàn)封裝。
封裝實(shí)現(xiàn)
#include <iostream> ? using std::cout; using std::endl; ? typedef struct complex { ? ? int x; ? ? int y; }COMP; ? void init(COMP &tmp,int x,int y) { ? ? tmp.x = x; ? ? tmp.y = y; } ? COMP * operator +(COMP &tmp1,COMP &tmp2) { ? ? COMP *p = static_cast<COMP *>(new COMP); ? ? p->x = tmp1.x + tmp2.x; ? ? p->y = tmp1.y + tmp2.y; ? ? return p; } ? COMP * operator -(COMP &tmp1,COMP &tmp2) { ? ? COMP *p = static_cast<COMP *>(new COMP); ? ? p->x = tmp1.x - tmp2.x; ? ? p->y = tmp1.y - tmp2.y; ? ? return p; } ? COMP * operator *(COMP &tmp1,COMP &tmp2) { ? ? COMP *p = static_cast<COMP *>(new COMP); ? ? p->x = tmp1.x*tmp2.x - tmp1.y*tmp2.y; ? ? p->y = tmp1.x*tmp2.y + tmp1.y*tmp2.x; ? ? return p; } ? int main() { ? ? COMP x,y; ? ? init(x,1,2); ? ? init(y,3,4); ? ? cout<<x.x<<" "<<x.y<<endl; ? ? cout<<y.x<<" "<<y.y<<endl; ? ? ? COMP *z; ? ? z = x+y; ? ? cout<<z->x<<" "<<z->y<<endl; ? ? delete z; ? ? ? z = x-y; ? ? cout<<z->x<<" "<<z->y<<endl; ? ? delete z; ? ? ? z = x*y; ? ? cout<<z->x<<" "<<z->y<<endl; ? ? delete z; ? ? ? return 0; }
結(jié)果為:
1 2
3 4
4 6
-2 -2
-5 10
上面的程序使用 struct 構(gòu)建了類(lèi)似復(fù)數(shù)的結(jié)果,并使用運(yùn)算符重載實(shí)現(xiàn)了復(fù)數(shù)的加、減、乘運(yùn)算。這樣如果我們要進(jìn)行復(fù)數(shù)的運(yùn)算的話(huà),可以直接使用 +-* 而不用具體關(guān)心內(nèi)部的實(shí)現(xiàn)過(guò)程,因?yàn)槲覀冊(cè)谝獾闹皇墙Y(jié)果的正確性。
封裝屬性
封裝的作用就像之前提到的那樣:對(duì)外提供接口,對(duì)內(nèi)提供數(shù)據(jù)。
雖然上邊的函數(shù)在全局構(gòu)建了接口函數(shù),但是卻也暴露了函數(shù)的實(shí)現(xiàn)過(guò)程,并且我們還能夠在外部直接訪問(wèn) struct 內(nèi)的數(shù)據(jù),這并不是我們想要的封裝形式。這是由 struct 的性質(zhì)決定的,在 C++ 中,提供了 class 的形式實(shí)現(xiàn)整個(gè)的封裝過(guò)程。
struct 和 class 的不同在于,struct 中的數(shù)據(jù)和方法都是 public 的,而 class 中的數(shù)據(jù)和方法卻是可以自定義的:
屬性 | 內(nèi)部 | 外部 |
public | yes | yes |
protected | yes | no |
private | yes | no |
protected 和 private 的區(qū)別在繼承形式上。
class 封裝
對(duì)于上邊的 complex,如果使用 class 來(lái)封裝:
#include <iostream> using std::cout; using std::endl; class complex { public: complex() { this->x = 0; this->y = 0; } complex(int x, int y):x(x),y(y){} complex * operator +(complex &tmp) { complex *p = static_cast<complex *>(new complex); p->x = this->x + tmp.x; p->y = this->y + tmp.y; return p; } complex * operator -(complex &tmp) { complex *p = static_cast<complex *>(new complex); p->x = this->x - tmp.x; p->y = this->y - tmp.y; return p; } complex * operator *(complex &tmp) { complex *p = static_cast<complex *>(new complex); p->x = this->x*tmp.x - this->y*tmp.y; p->y = this->x*tmp.y + this->y*tmp.x; return p; } void display() { cout<<this->x<<" "<<this->y<<endl; } private: int x; int y; }; int main() { complex x(1,2),y(3,4); x.display(); y.display(); complex *z; z = x+y; z->display(); delete z; z = x-y; z->display(); delete z; z = x*y; z->display(); delete z; return 0; }
結(jié)果為:
1 2
3 4
4 6
-2 -2
-5 10
上邊的程序使用 class 的概念封裝了 complex 的形式,該形式下能夠從外部調(diào)用對(duì)象的方法,但是卻不能夠從外部訪問(wèn)對(duì)象的數(shù)據(jù),達(dá)到了封裝的要求。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++ STL入門(mén)教程(3) deque雙向隊(duì)列使用方法
這篇文章主要為大家詳細(xì)介紹了C++ STL入門(mén)教程第三篇,deque雙向隊(duì)列的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08C/C++之long int與long long的區(qū)別及說(shuō)明
這篇文章主要介紹了C/C++之long int與long long的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08簡(jiǎn)單了解C語(yǔ)言中直接插入排序與直接選擇排序?qū)崿F(xiàn)
這篇文章主要介紹了C語(yǔ)言中直接插入排序與直接選擇排序?qū)崿F(xiàn),插入排序的基本操作就是將一個(gè)數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個(gè)新的、個(gè)數(shù)加一的有序數(shù)據(jù),需要的朋友可以參考下2016-03-03C語(yǔ)言中的函數(shù)指針基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言中的函數(shù)指針基礎(chǔ)學(xué)習(xí)教程,包括函數(shù)指針作為參數(shù)來(lái)傳遞等重要知識(shí),需要的朋友可以參考下2016-04-04淺析C++標(biāo)準(zhǔn)庫(kù)元組(tuple)源碼
這篇文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)元組(tuple)源碼,介紹了什么是元組以及用法,并進(jìn)行了源碼分析,需要的朋友可以參考下2015-08-08常用排序算法的C語(yǔ)言版實(shí)現(xiàn)示例整理
這篇文章主要介紹了常用排序算法的C語(yǔ)言版實(shí)現(xiàn)示例整理,包括快速排序及冒泡排序等,基本上都給出了時(shí)間復(fù)雜度,需要的朋友可以參考下2016-03-03教你如何使用C++ 統(tǒng)計(jì)地鐵中站名出現(xiàn)的字的個(gè)數(shù)
通過(guò)本文教大家如何使用C++ 統(tǒng)計(jì)地鐵中站名出現(xiàn)的字的個(gè)數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-01-01一文詳解Qt如何讀取和寫(xiě)入配置文件的數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了在Qt中如何實(shí)現(xiàn)讀取和寫(xiě)入配置文件的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-03-03C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07