溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++?封裝的含義和簡(jiǎn)單實(shí)現(xiàn)方式講解

發(fā)布時(shí)間:2022-07-25 13:39:33 來(lái)源:億速云 閱讀:216 作者:栢白 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C++ 封裝的含義和簡(jiǎn)單實(shí)現(xiàn)方式講解,具有一定借鑒價(jià)值,需要的朋友可以參考下。下面就和我一起來(lái)看看吧。

目錄
  • 封裝實(shí)現(xiàn)

  • 封裝屬性

  • class 封裝

其實(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ù)類型也可以實(shí)現(xiàn)封裝。這樣做的好處就是對(duì)外屏蔽了功能實(shí)現(xiàn),對(duì)內(nèi)開放了數(shù)據(jù)權(quán)限。

C++ 中的類和對(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)建了類似復(fù)數(shù)的結(jié)果,并使用運(yùn)算符重載實(shí)現(xiàn)了復(fù)數(shù)的加、減、乘運(yùn)算。這樣如果我們要進(jìn)行復(fù)數(shù)的運(yùn)算的話,可以直接使用 +-* 而不用具體關(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)部外部
publicyes

yes

protectedyesno
privateyesno

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á)到了封裝的要求。

以上就是C++ 封裝的含義和簡(jiǎn)單實(shí)現(xiàn)方式講解的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來(lái)億速云行業(yè)資訊!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI