c言語入門からc++使用達人:C++などを深く学ぶ(一)


第三章類
第1節メンバー関数、オブジェクトコピー、プライベートメンバー
1.総説
  • クラスは、独自に定義したデータ型(新しいタイプ)
  • です.
  • クラスを設計する際に考慮すべき角度
  • は設計と実現者の角度から
  • を考慮する.
  • 利用者の立場から考える
  • .
  • 親、子
  • 2.クラスベース
  • クラスは、ユーザーが自分で定義したデータ型であり、クラスをネーミングスペースとして想像し、荷物(メンバー関数、メンバー変数)
  • を包んでいる.
  • クラスの構成:メンバー変数、メンバー関数(特殊なメンバー関数がたくさんありますが、後で説明します)
  • がクラスメンバーにアクセスするとき、クラスオブジェクトである場合、オブジェクト名を使用します.メンバー名はメンバーにアクセスします.オブジェクトへのポインタの場合は、ポインタ名->メンバー名を使用してメンバー
  • にアクセスします.
  • publicメンバーは対外的なインタフェースを提供し、外部に露出し、外部呼び出しを提供し、privateメンバーは各種の実装クラス機能の詳細な方法を提供するが、使用者に暴露しないで、外部はこれらのメンバー
  • を使用することができない.
  • structはメンバーのデフォルトがpublicのclassであり、struct A{}である.classメンバーのデフォルトはプライベート、class A{};==>struct A{}はclass A{public:}
  • に等しい
    #include 
    
    using namespace std;
    class student{
    public:
        int num;
    };
    
    int main() {
    
    
        student someone;//   
        someone.num =100;
        cout << someone.num << endl;
    
        student *pstu;
        pstu = &someone;
        pstu->num = 88;
        cout <<  pstu->num << endl;
    
        return 0;
    }
    

    3.メンバー関数
    完全な例
  • Time.h
  • //
    // Created by felaim on 2020/5/26.
    //
    
    #ifndef LESSION_PART_TWO_TIME_H
    #define LESSION_PART_TWO_TIME_H
    
    class Time {
    public:
        int Hour;
        int Minute;
        int Second;
    
        void initTime(int tmphour, int tmpmin, int tmpsec);
    };
    
    #endif //LESSION_PART_TWO_TIME_H
    
    
  • Time.cpp
  • //
    // Created by felaim on 2020/5/26.
    //
    #include "Time.h"
    
    //     initTime   
    // ::        ,  initTime  Time 
    void Time::initTime(int tmphour, int tmpmin, int tmpsec) {
        //                
        //            ,              
        Hour = tmphour;
        Minute = tmpmin;
        Second = tmpsec;
    }
    
    
  • main.cpp
  • #include 
    #include "Time.h"
    
    using namespace std;
    
    int main() {
        Time mytime;
        mytime.initTime(11, 14, 45);
        //mytime: 11:14:45
        cout << "mytime: " << mytime.Hour << ":" << mytime.Minute << ":" << mytime.Second << endl;
    
        return 0;
    }
    
  • CMakeLists.txt
  • cmake_minimum_required(VERSION 3.14)
    project(lession_part_two)
    
    set(CMAKE_CXX_STANDARD 11)
    include_directories(./include/)
    add_executable(lession_part_two main.cpp ./source/Time.cpp)
    

    4.オブジェクトのコピー
  • オブジェクトはコピー可能であるが、デフォルトでは、この種類のオブジェクトのコピーは、メンバー変数ごとに
  • ずつコピーされる.
  • Timeクラスで適切な「付与演算子」を定義すると、オブジェクトのこのコピー
  • を制御できます.
    #include 
    #include "Time.h"
    
    using namespace std;
    
    int main() {
        Time myTime;
        myTime.initTime(11, 14, 45);
        //mytime: 11:14:45
        cout << "myTime: " << myTime.Hour << ":" << myTime.Minute << ":" << myTime.Second << endl;
    
        //     ,            
        Time myTime0 = myTime;
        Time myTime1{myTime};
        Time myTime2(myTime);
        Time myTime3 = {myTime};
        myTime3.Hour = 12;
        cout << "myTime: " << myTime.Hour << ":" << myTime.Minute << ":" << myTime.Second << endl;
        cout << "myTime3: " << myTime3.Hour << ":" << myTime3.Minute << ":" << myTime3.Second << endl;
        
        return 0;
    }
    

    5.プライベートメンバー
  • Time.h
  • //
    // Created by felaim on 2020/5/26.
    //
    
    #ifndef LESSION_PART_TWO_TIME_H
    #define LESSION_PART_TWO_TIME_H
    
    class Time {
    private:
        //                      
        //            
        int Millisecond;//  
        void initMillTime(int mls);
    
    public:
        int Hour;
        int Minute;
        int Second;
    
        void initTime(int tmphour, int tmpmin, int tmpsec);
    
    };
    
    #endif //LESSION_PART_TWO_TIME_H
    
    

    -Time.cpp
    //
    // Created by felaim on 2020/5/26.
    //
    #include "Time.h"
    
    //     initTime   
    // ::        ,  initTime  Time 
    void Time::initTime(int tmphour, int tmpmin, int tmpsec) {
        //                
        //            ,              
        Hour = tmphour;
        Minute = tmpmin;
        Second = tmpsec;
    
        initMillTime(25);
    }
    
    void Time::initMillTime(int mls) {
        Millisecond = mls; //          
    }