[CPP Module 00] Namespace, class, member functions, stdio stream, initialization lists, static, const


1.オブジェクト指向の理解
オブジェクト向けテクノロジーは,符号化エラーを低減し,コードの可読性を向上させ,メンテナンスしやすいコードを記述することができる.データと機能が結合した概念をオブジェクトと呼ぶ.プログラミング言語でオブジェクトを実現する手段をクラスと呼ぶ.
一般に、データの処理には構造体が使用され、機能の処理にもクラスが使用されます.
1.1. オブジェクトを構成するのはデータと機能です
電話帳プログラムでオブジェクト向けについて知りましょう.このプログラムは電話帳のオブジェクトに存在します.そして、私は以下のことをします.
  • 電話帳に連絡先を追加または照会します.
  • 電話帳には8人が格納されている.
  • 電話帳には、各人の氏名、電話番号が格納されている.
  • 1.電話帳の動作を表す.まだあります.わあ.電話帳の状態を表す.これらのオブジェクトは、1つ以上のステータスデータと1つ以上の動作(機能)から構成されます.このとき,状態情報は変数(属性)により実現され,動作は関数(方法)により実現される.これを次のようにコードで表します.
    class Contact 
    {
    private:
    	std::string first_name;
    	std::string last_name;
    	std::string phone_number;
    
    public:
    	void set_first_name(const std::string str);
    	void set_last_name(const std::string str);
    	void set_phone_number(const std::string str);
    
    	std::string get_first_name(void) const;
    	std::string get_last_name(void) const;
    	std::string get_phone_number(void) const;
    };
    1.2. オブジェクトとインスタンス
    実際には,宣言占有メモリをインスタンス化,実際に占有メモリの変数などをインスタンスと呼ぶ.メモリ内の特定のクラスタイプのオブジェクトもインスタンスと呼ばれます.
    1.3. オブジェクト向けプログラミングの特徴
  • 抽象
  • パッケージング
  • 隠し情報
  • 継承
  • 多形性(多態性)
  • 2.アクセス制御
    次の3つのアクセス制御インジケータにより、クラス内のメンバーへの外部からの直接アクセスを許可または禁止できます.近接関数を用いてカプセル化を最大化できた.
  • public:すべての外部アクセスメンバーを許可
  • private:すべてのアクセスを禁止
  • protected:継承関係から派生クラスへのアクセスのみ許可
  • クラスのデフォルトアクセス制御権限はprivate、構造体、および共通体はpublicです.
    2.1. 情報の非表示とカプセル化
    #include <iostream>
    
    using namespace std;
    
    struct TV 
    {
      bool powerOn;
      int channel;
      int volume;
      
      void setVolume(int vol) 
      {
        if (vol >= 0 && vol <= 100) 
          volume = vol;
      }
    };
    
    int main() 
    {
      TV lg;
      lg.powerOn = true;
      lg.channel = 11;
      lg.setVolume(50);
      lg.volume = 400; // 의도치 않은 접근 가능
    }
    TV構造体の各メンバーを定義し、メイン関数で初期化しています.ボリュームのサイズを0~100に制限する場合は、上記の例のように構造体の内部にsetVolumeという関数を作成して使用できます.
    しかし、上記のコードの問題は、ボリュームメンバーにアクセスできることです.次のコードのように,アクセスインジケータを用いて情報隠蔽を実現し,より安定したプログラムを開発することができる.
    #include <iostream>
    
    using namespace std;
    
    struct TV 
    {
    private: //외부 접근 차단
      bool powerOn;
      int channel;
      int volume;
      
    public: //외부 접근 허용
      void on() 
      {
        powerOn = true;
        cout << "TV on." << endl;
      }
      
      void off() 
      {
        powerOn = false;
        cout << "TV off." << endl;
      }
      
      void setChannel(int num) 
      {
        if (num >= 1 && num <= 999)
          channel = num;
       	cout << "채널을 " << num << "(으)로 변경했습니다." << endl;
      }
      
      void setVolume(int vol) 
      {
        if (vol >= 0 && vol <= 100) 
          volume = vol;
        cout << "볼륨을 " << vol << "(으)로 변경했습니다." << endl;
      }
    };
    
    int main() 
    {
      TV lg;
      lg.powerOn = on();
      lg.setChannel(11);
      lg.setVolume(50);
    }
    メンバー変数をprivateとして宣言し、その変数にアクセスする関数を定義し、メンバー変数のアクセスを安全な形式で導くことが情報隠蔽であり、良いクラスになるための基本条件である.このように一部のメンバーを保護し,また外部ユーザに近づくことができるインタフェースを作成することを「カプセル化」と呼ぶ.
    3.メンバー関数の定義方法
    メンバー関数を定義するには、2つの方法があります.
  • 内部クラスの定義
  • クラス定義関数
  • 外部クラスの定義
  • ::使用演算子(範囲解析オペレータ)
  • #include <iostream>
    
    using namespace std;
    
    class TV 
    {
    private:
      bool powerOn;
      int volume;
      
    public: 
      // 내부 클래스 정의
      void on() 
      {
        powerOn = true;
        cout << "TV on." << endl;
      }
      
      void off() 
      {
        powerOn = false;
        cout << "TV off." << endl;
      }
      
      // 외부 클래스 정의
      void setVolume(int vol);
    };
    
    // 외부 클래스 정의
    void TV::setVolume(int vol) 
    {
      if (vol >= 0 && vol <= 100) 
        volume = vol;
      cout << "볼륨을 " << vol << "(으)로 변경했습니다." << endl;
    }
    
    int main() 
    {
      TV lg;
     
      lg.powerOn = on();
      lg.setVolume(50);
    }
    通常、外部クラス定義が使用されます.
    4.生成者と消滅者
    4.1. コンストラクタ
    すべてのメンバー変数を初期化するまで、インスタンスは使用できません.privateメンバーは通常の方法で初期化できないため、CPPは作成者というメンバー関数を提供します.クラスにオブジェクトを作成するたびに、コンパイラはクラスの作成者を自動的に呼び出します.
  • ジェネレータは、オブジェクトを作成しながらメンバー変数を初期化するpubilc関数です.
  • クラス作成者の名前は、クラスの名前と同じである必要があります.
  • 作成者は、初期化のためのデータを引数として受信することができる.
  • クラスジェネレータのプロトタイプは、クラス宣言の共通領域に含める必要があります.
  • 戻り値はありませんが、voidタイプとして宣言しません.
  • クラスには複数のジェネレータがあります.
  • #include <iostream>
    
    using namespace std;
    
    class TV 
    {
    private:
      bool powerOn;
      int volume;
      
    public: 
    	TV(void); // 생성자 함수의 원형
    }
    
    // 생성자 함수
    TV::TV(void)
    {
      powerOn = true;
      volume = 50;
    }
    
    int main() 
    {
      TV lg; // 생성자의 암시적 호출
      // TV lg = TV // 생성자의 명시적 호출
    }
    4.2. イニシエータリスト
    頭文字のRiserリストは、オブジェクトまたはメンバー変数の初期化をより簡単にします.
    class TV 
    {
    private:
      bool powerOn;
      int volume;
      
    public: 
    	TV(void) 
        : volume(50) 
     	{} //이니셜라이저를 통한 초기화
    }
  • 通常は、メンバー変数を初期化する際に頭文字Riserリストを使用します.
  • 初期化するメンバーが複数ある場合は、,(カンマ)をカンマでリストします.
  • constメンバー変数は、イニシャルログインを使用して初期化することもできます.
  • 4.3. 消滅者(destructor)
    生成者とは逆に,オブジェクト消滅時に呼び出さなければならないのは消滅者である.
  • クラス名の前に記号~の名前が付いています.
  • 戻りタイプは宣言されておらず、実際には返されません.
  • 消滅者は、オブジェクトを消滅させる過程で自動的に呼び出される.また、ダイレクトブランキングが定義されていない場合は、デフォルト値を生成したユーザーと同じように自動的に挿入されます.
  • コンストラクション関数にnew演算子を使用して割り当てられたメモリがある場合は、delete演算子を使用してコンストラクション関数から消去する必要があります.
  • 5.クラスの外部にアクセスするメンバー変数
    class Contact 
    {
    private:
    	std::string first_name;
    	std::string last_name;
    	std::string phone_number;
    
    public:
    	void set_first_name(const std::string str);
    	void set_last_name(const std::string str);
    	void set_phone_number(const std::string str);
    
    	std::string get_first_name(void) const;
    	std::string get_last_name(void) const;
    	std::string get_phone_number(void) const;
    };
    5.1. アクセス関数
    クラスのアクセス指定子としてprivateを使用し、アクセス関数を使用してカプセル化を最大化します.
    5.2. const関数
    getter関数の後ろにconstインジケータが表示されます.constこの関数では、メンバー変数に格納されている値は変更されません.したがって、const宣言が追加されたメンバー関数内でメンバー変数の値を変更すると、コンパイルエラーが発生します.const関数では、const関数以外の呼び出しが制限されます.これは,メンバ変数の値が変化する可能性をいっそ許さないためである.
    6.CPPの静的
    6.1. 静的メンバー変数
    静的メンバー変数はクラス内のグローバル変数の概念と見なすことができる.すなわち、1つの静的メンバー変数は、同じクラスのすべてのオブジェクトに使用できます.静的メンバー変数にはクラス名を使用してアクセスする必要があります.private静的メンバー変数には静的メンバー関数を使用してアクセスします.
    6.2. 静的メンバー関数
    クラスのメンバー関数は、静的(static)として宣言することもできます.このように宣言された静的メンバー関数は、クラスのオブジェクトを作成することなく、クラス名のみを呼び出すことができます.これらの静的メンバー関数には、次の特徴があります.
  • オブジェクトは作成されず、クラス名のみが呼び出されます.
  • オブジェクトは作成されません.thisポインタはありません.
  • 特定のオブジェクトとマージされないため、静的メンバー変数のみが使用できます