7. C++中類的封裝

類通常分爲以下兩個部分

        1. 類的實現細節
               2. 類的使用方式

       注:當使用類時,不需要關心其實現細節;當創建一個類時,才需要考慮其內部實現細節;

使用手機時,只需要知道如何發短信,打電話,拍照等等即可,不需要關心手機是如何開發出來的。手機開發工程師就需要考慮手機內部的實現細節,如硬件細節和軟件細節。

 

一、封裝的基本概念

根據日常生活中的經驗:並不是類的每個屬性都是對外公開的
                如:女孩子不希望外人知道自己的年齡和身高
                如:一些男孩子不希望別人知道自己會尿牀
       而一些類的屬性是對外公開的
                如:人類的姓名,學歷,國籍等
       因此,需要在類的表示法中定義屬性和行爲的公開級別,類似文件系統中文件的權限

 

二、C++中類的封裝

成員變量
               C++中用於表示類屬性的變量;
       成員函數
               C++中用於表示類行爲的函數;
       在C++中可以給成員變量和成員函數定義訪問級別
              public
                      成員變量和成員函數可以在類的內部和外界訪問和調用
              private
                      成員變量和成員函數只能在類的內部被訪問和調用

類成員的訪問屬性demo:

#include <stdio.h>

struct Biology 
{
    bool living;
};

struct Animal : Biology 
{
    bool movable;
    void findFood() 
    { 
    }
};

struct Plant : Biology 
{
    bool growable;
};

struct Beast : Animal 
{
    void sleep()
    { 
    }
};

struct Human : Animal 
{
    void sleep() 
    {
        printf("I'm sleeping...\n");
    }
    
    void work()
    {
        printf("I'm working...\n");
    }
};

struct Girl : Human
{
private:
    int age;

public:
    void play()
    {
        printf("I'm girl, I'm playing...\n");
    }
    
    void print()
    {
        age = 22;
        
        printf("Girl's age is %d\n", age);
         
        play();
        sleep();
        work();
    }
};

struct Boy : Human
{
public:
    int age;
    
    void play()
    {
        printf("I'm boy, I'm playing...\n");
    }
    
    void print()
    {
        age = 23;
        
        printf("Boy's age is %d\n", age);
        
        play();
        sleep();
        work();
    }
};

int main(int argc, char *argv[])
{
    Girl girl;
    
    girl.print();

    Boy boy;
    
    boy.print();
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

編譯運行結果如下:

 

三、類成員的作用域

      類成員的作用域都只在類的內部,外部無法直接訪問
              成員函數可以直接訪問成員變量和調用其它成員函數
     類的外部可以通過類變量訪問public成員
             類成員的作用域與訪問級別沒有關係

注:C++中用struct定義的類的所有成員默認爲public

類成員的作用域demo:

#include <stdio.h>

int i = 1;

struct Test
{
private:
    int i;

public:
    int j;
        
    int getI()
    {
        i = 3;
        
        return i;
    }
};

int main()
{
    int i = 2;
    
    Test test;
    
    test.j = 4;
    
    printf("i = %d\n", i);
    printf("::i = %d\n", ::i);
    //printf("test.i = %d\n", test.i);
    printf("test.j = %d\n", test.j);
    printf("test.getI() = %d\n", test.getI());
    
    printf("Press any key to continue...");
    getchar();
    
    return 0;
}

編譯運行結果如下:

 

四、類的真正形態

struct在C語言中已經有了自己的含義,只能繼續兼容。在C++中提供了新的關鍵字class用於類定義。class和struct的用法是完全相同的。

class和struct有什麼區別?

              1. 在用struct定義類時,所有成員的默認屬性爲public
              2. 在用class定義類時,所有成員的默認屬性爲private

#include <stdio.h>

struct A
{
    int i;
    
    int getI()
    {
        return i;
    }
};

class B
{
    int i;
    
    int getI()
    {
        return i;
    }
};

int main(int argc, char *argv[])
{
    A a;
    B b;
    
    a.i = 1;
    a.getI();
    
    b.i = 2;
    b.getI();
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

編譯運行結果如下:

 

五、一個運算類的實現

要求:
                1. 提供setOperator函數設置運算類型,如加,減,乘,除;
                2. 提供setParameter函數設置運算參數,類型爲整型;
                3. 提供result函數進行運算,其返回值表示運算的合法性,通過引用參數返回結果;

//Operator.cpp
#include "Operator.h"

bool Operator::setOperator(char op)
{
    bool ret = false;
        
    if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
    {
        ret = true;
        mOp = op;
    }
    else
    {
        mOp = '\0';
    }
        
    return ret;
}

void Operator::setParameter(double p1, double p2)
{
    mP1 = p1;
    mP2 = p2;
}
    
bool Operator::result(double& r)
{
    bool ret = true;
        
    switch( mOp )
    {
        case '/':
            if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
            {
                ret = false;
            }
            else
            {
                r = mP1 / mP2;
            }
            break;
        case '+':
            r = mP1 + mP2;
            break;
        case '*':
            r = mP1 * mP2;
            break;
        case '-':
            r = mP1 - mP2;
            break;
        default:
            ret = false;
            break;
    }
        
    return ret;
}
//Operator.h
#ifndef _OPERATOR_H_
#define _OPERATOR_H_

class Operator
{
private:
    char mOp;
    double mP1;
    double mP2;
    
public:
    bool setOperator(char op);
    void setParameter(double p1, double p2);
    bool result(double& r);
};

#endif
//main.cpp
#include <stdio.h>
#include "Operator.h"

int main(int argc, char *argv[])
{
    Operator op;
    double r = 0;
    
    op.setOperator('/');
    op.setParameter(8, 4);
    
    if( op.result(r) )
    {
        printf("Result is %f\n", r);
    }
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

編譯運行結果如下:

 

六、總結

類的精華在於封裝
               1. 將實現細節和使用方式相分離;

C++中通過public和private實現類的封裝
               1. public成員可以通過變量被外界訪問;
               2. private成員只能夠在類內部使用;

類的定義和實現可以分開到不同的文件中。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章