C++言語学習(三)——パッケージング(Encapsulation)


C++言語学習(三)——パッケージング(Encapsulation)
一、パッケージの概要
C言語などのプロセス向けプログラミングでは、データおよびデータの関連操作関数は分離された独立した個体である.C++などのオブジェクト向けプログラミングでは,データおよびデータに関する操作がオブジェクトとして設計され,オブジェクトは属性(データ)と操作(関数)を含み,両者は共にオブジェクトエンティティ(すなわちクラスエンティティ)を構成する.オブジェクト向けプログラミングは、プログラムをよりモジュール化し、読みやすく、書きやすくし、コードをより高いレベルに再利用することができます.オブジェクト向けプログラミングでは,データとデータの操作をオブジェクトにカプセル化する.パッケージは実装の詳細を隠すことができ、コードをモジュール化することができ、プロセスとデータを包囲し、データへのアクセスは定義されたインタフェースしか通過できません.パッケージは対外的にサービスを提供するモデルであり、パッケージモデルは世の中の万物の個体抽象である.カプセル化されたアクセス属性は、アクセス属性オブジェクト内部オブジェクト外部public共有アクセス可能protected保護アクセス不可privateプライベートアクセス不可C言語、struct内のすべての動作と属性がpublic(デフォルト)であり、インタフェースを使用することも、内部データを遮断することなく直接アクセスすることもできます.C++言語では、C言語のカプセル化特性を強化し、struct、classは行為と属性のアクセス方式を指定し、内部にデータを開放し、外部にデータを遮蔽し、外部にインタフェースを提供することができる.
二、C言語のパッケージ
C言語では,通常モジュール化を用いてカプセル化される.stackのC言語実装:
#include 
#include 

typedef struct stack
{
    char space[1024];
    int top;
}stack;

void stack_init(stack *st)
{
    st->top = 0;
    memset(&st->space, 0, sizeof(st->space));
}

int is_empty(stack *st)
{
    return st->top == 0;
}
int is_full(stack *st)
{
    return st->top == 1024;
}

char pop(stack *st)
{
    return st->space[--st->top];
}

void push(stack *st, char c)
{
    st->space[st->top++] = c;
}

int main(void)
{
    stack st;
    stack_init(&st);
    unsigned int i;
    for(i = 'a'; i < ('z' + 1); i++)
    {
        if(!is_full(&st))
            push(&st, i);
    }
    for(i = 'a'; i < ('z' + 1); i++)
    {
        printf("%c
", pop(&st)); } return 0; }

C言語でカプセル化されたstructのデータメンバーは外部から呼び出されて変更することができる.
三、C++言語のパッケージ
1、C++言語のパッケージ
C++言語はC言語のカプセル化を強化し,クラスの表現で属性と動作のアクセスレベルを定義する.C++言語では、クラス属性を表す変数がメンバー変数である.クラスの動作を表す関数はメンバー関数です.C++言語では、クラスのメンバー変数とメンバー関数にアクセスレベルを定義できます.public:publicキーワードで宣言されたクラスのメンバー変数とメンバー関数を使用してクラスの内部と外部でprivateにアクセスおよび呼び出すことができます.privateキーワードで宣言されたクラスのメンバー変数とメンバー関数はクラスの内部でのみprotectedにアクセスおよび呼び出すことができます.protectedキーワードで宣言されたクラスのメンバー変数とメンバー関数は、このクラスおよび派生子クラスの内部でのみ使用できます.アクセスと呼び出し.クラスのメンバーの役割ドメインはクラスの内部にのみ存在し、外部は直接アクセスできません.クラスのメンバー関数は、メンバー変数に直接アクセスし、メンバー関数を呼び出すことができます.クラスの外部は、クラスオブジェクトからpublicメンバーにアクセスできます.C++言語ではstruct定義のクラス内のメンバーのデフォルトアクセス権はpublic、class定義のクラス内のメンバーのデフォルトアクセス権はprivateです.
2、C++言語のstruct
C++言語ではstructキーワードが拡張され、structはC言語の変数集合のstructだけでなく、C++言語のstructはメンバー関数を定義するだけでなく、継承とマルチステートを実現することができます.C言語のstructと同様に、C++言語でstructを使用してクラスを定義する場合、メンバーのデフォルトのアクセスレベルはpublicです.
#include 

using namespace std;

struct Person
{
    const char* name;
    int age;
    virtual void print()
    {
        printf("My name is %s, I'm is %d years old.
",name,age); } }; // public struct Student : Person { void print() { printf("My name is %s, I'm is %d years old." "My score is %d
",name,age,score); } void setScore(const int n) { score = n; } private: int score; }; int main(int argc, char *argv[]) { Person p; p.name = "Bob"; p.age = 30; p.print(); Student s; s.name = "Bauer"; s.age = 20; s.setScore(98); s.print(); dynamic_cast(&s)->print(); return 0; }

3、C++言語のclass
C++言語のstructはC言語と互換性のあるstructを必要とするため、C++言語は新しいclassキーワード定義クラスを使用する.クラスをclassで定義する場合、メンバーのデフォルトのアクセスレベルはprivateです.C++のクラスは宣言と実現の分離をサポートし、クラスの定義と実現を分離し、通常.hヘッダファイルにはクラスの宣言のみがあり、メンバー変数とメンバー関数の宣言を含む.cppソースファイルでクラスのメンバー関数の実装を完了します.
#include 

using namespace std;

class Person
{
public:
    const char* name;
    int age;
    virtual void print()
    {
        printf("My name is %s, I'm is %d years old.
",name,age); } }; class Student : public Person { public: void print() { printf("My name is %s, I'm is %d years old." "My score is %d
",name,age,score); } void setScore(const int n) { score = n; } private: int score; }; int main(int argc, char *argv[]) { Person p; p.name = "Bob"; p.age = 30; p.print(); Student s; s.name = "Bauer"; s.age = 20; s.setScore(98); s.print(); dynamic_cast(&s)->print(); return 0; }

4、C++言語structとclassの違い
C++言語におけるstructとclassの最も本質的な違いは、A、デフォルトアクセス権が異なることです.structのデフォルトのアクセス権はpublicで、classのデフォルトのアクセス権はprivateです.B、デフォルト継承アクセス権が異なります.structのデフォルトの継承アクセス権はpublicであり、classのデフォルトの継承アクセス権はprivateです.C、classはテンプレートパラメータを定義するキーワードとして使用できますが、structはできません.C++言語では、継承時に継承アクセス権が指定されていない場合、デフォルトの継承アクセス権がpublic継承かprivate継承かは、ベースクラスではなくサブクラスによって異なります.structはclassを継承することができ、classはstructを継承することができ、デフォルトの継承アクセス権はサブクラスがstructかclassかに依存し、サブクラスがstruct宣言を使用する場合、デフォルトの継承アクセス権はpublicである.サブクラスがclass宣言を使用する場合、デフォルトの継承アクセス権はprivateです.
#include 

using namespace std;

class Person
{
public:
    const char* name;
    int age;
    virtual void print()
    {
        printf("My name is %s, I'm is %d years old.
",name,age); } }; // public struct Student : public Person { public: void print() { printf("My name is %s, I'm is %d years old." "My score is %d
",name,age,score); } void setScore(const int n) { score = n; } private: int score; }; int main(int argc, char *argv[]) { Person p; p.name = "Bob"; p.age = 30; p.print(); Student s; s.name = "Bauer"; s.age = 20; s.setScore(98); s.print(); dynamic_cast(&s)->print(); return 0; }

5、C++言語パッケージ例
C++クラス実装stack:stack.hソース:
#ifndef STACK_H
#define STACK_H

class stack
{
public:
    stack();
    bool is_empty();
    bool is_full();
    void push(char c);
    char pop();
private:
    char space[1024];
    unsigned int top;
};

#endif // STACK_H

stack.cppソース:
#include "stack.h"
#include 

stack::stack()
{
    top = 0;
    memset(space, 0, sizeof(space));
}

bool stack::is_empty()
{
    return top == 0;
}

bool stack::is_full()
{
    return top == 1024;
}

void stack::push(char c)
{
    space[top++] = c;
}

char stack::pop()
{
    return space[--top];
}

main.cppソース:
#include 
#include "stack.h"
#include 
using namespace std;

int main()
{
    stack st;
    unsigned int i;
    for(i = 'a'; i < 'z' + 1; i++)
    {
        if(!st.is_full())
            st.push(i);
    }
    for(i = 'a'; i < 'z' + 1; i++)
    {
        cout<

C++言語でカプセル化されたclass stackのデータメンバーはprivateであり、外部にアクセスできない場合は、データメンバーと操作方法のアクセス権を設定することで、外部に対してデータメンバーと操作方法を開放、遮蔽することができる.C++はクラスメンバーのアクセスレベルを定義することによってカプセル化メカニズムを実現する.C++言語ではクラスは宣言と実装の分離をサポートし,ヘッダファイルではクラスを宣言し,ソースファイルではクラスを実装する.