GeekBand C++オブジェクト向け高度プログラミング(上)First Week

7155 ワード

C++の歴史と進化
C++は最初はC言語の上の1種の開拓で、それから進化して今まで、すでに独立して注目されている言語です.言語関係図:B->C->C++(new C->C with class->C++進化路線図:C++98->C++03->C++11->C++14
C++のいくつかのモード
C++自体は一つの言語の連邦と見なされ、それ自体は多様な言語である.C++をマスターするには、いくつかのC++の常用パターンを理解する必要があります.
  • Clean C
  • Object-Oriented C++
  • Template C++
  • STL

  • C++本来の翻訳はCプラスプラスプラスプラスとして、第1版言語自体はC with Classと呼ぶことができる.Classという名詞に対してC++にはOBP&OOPと区別できるものがある.OBP自体はC++を利用したData Resourceのパッケージであり、ここでは一般的に単一のClassであり、他のClassと多くのインタラクションが発生することは少ない.OOP自体は継承とマルチステートをより多く使用し,OOPはClassとClassの関係をより重視している.ClassとClassの関係には継承(inheritance)、複合(composition)、依頼(delegation)がある.
    C++コードの基本構造
    C++のコードは一般に宣言部分&&実装部分に分けられる.宣言部分は一般的に保存されます.h .hppの最後のファイルにあります.実装部分は一般的に保存する.cc .cpp .C末尾のファイルにあります.なぜここで声明&&実現を区別するのか.1つのプロジェクトに1つのファイルしかないわけではないので、一般的に1つのプロジェクトはマルチコラボレーションです.まず、単一のファイルを複数で編集することはできません.第二に、もし一人一人がプロジェクトのモジュールを担当すれば、一人は自分の部分と他人が自分に関連している部分に関心を持っている限り.実装と宣言が分離されている場合、関係者は開発時に宣言の部分を約束するだけで、開発過程で実装に関心を持たず、最後にコードの統合テストを行うことができます.C++の宣言ファイルには、複数回含まれるのを防ぐための2つのテクニックがあります.1つは防御式宣言(ifndef)、1つは#pragma onceを使用する
  • 防御式声明
  • // hello.h
    #ifndef HELLO_H_
    #define HELLO_H_
    #endif // HELLO_H_
    
  • pragma
  • // hello.h
    #pragma once
    

    C++ Class
    C++そのものにはC言語部分であるClean Cが含まれていると考えられる.C言語の宣言&&制御、C++は基本的に似ています.C++のClassは一般に構造と構造部分を含む.コンストラクションは、オブジェクトを初期化するために使用されます.コンストラクションは、オブジェクトのライフサイクルが終了した後、コンパイラにオブジェクトを削除する方法を教えます.コンストラクション関数とコンストラクション関数は特殊な関数に属します.どちらの関数も戻り値がありません.C++のオブジェクトの名前がcomplexであれば、コンストラクション関数はcomplex(...),...パラメータリストを表します.ここでcomplexは複数あり、それ自体がリロードできることがわかります.構造関数は~complexであり,構造関数にはパラメータリストがない.C++コンストラクション関数またはコンストラクション関数を宣言しない場合.コンパイラ自体は、構造関数または構造関数を合成します.合成されたコンストラクション関数にはパラメータリストがありません.クラスにポインタが含まれている場合は、構造関数をカスタマイズしたほうがいいです.そうしないと、合成された構造関数はdeleteポインタに対応するオブジェクトではありません.
    class complex {
    public:
        complex(int re, int im); //     
        ~complex(); //     
    private:
        int re_, im_;      
    };
    

    C++自体にもpublic,private,protectedなどの制御権限があります.publicはクラス以外でもアクセスできることを示し,privateはクラスでのみアクセスできることを示す.protectedは、継承されたクラスに直接アクセスできることを示す.classのデフォルトはprivateタイプで、structのデフォルトはpublicタイプです.これはclass/structが宣言した両者の根本的な違いです.ここでは、構造関数がprivate領域で単一のモードを実現するために使用できる場合の特徴がある.
    // singleton
    #include 
    using namespace std;
    
    class Singleton {
        Singleton() {}
    
    
        static Singleton *instance;
    
    public:
        ~Singleton() { cout << "Singleton dtor" << endl; }
    
        struct GC {
                ~GC() { if(instance) { cout << "Delete Singleton" << endl; delete instance; } }
        };
    
    private:
        static GC gc;
    
    public:
        static Singleton *Instance() {
            if (!instance) {
                instance = new Singleton;
            }
    
            return instance;
        }
    
    };
    
    Singleton *Singleton::instance = NULL;
    Singleton::GC gc;
    
    int main()
    {
        Singleton *s = Singleton::Instance();
    
        // delete t;
    
        return 0;
    }
    

    C++の1つのメンバーfunctionはconstであってもよいが、ここではthisポインタがconstであるため、クラスインスタンスのメンバー変数の値を変更することはできないことを示す.constのクラスインスタンス変数はconstメソッドのみを呼び出すことができます
    class complex {
    public:
        complex(double r = 0, double i = 0) : re(r), im(i) {}
        complex &operator+=(const complex &);
        complex &operator-=(const complex &);
        complex &operator*=(const complex &);
        complex &operator/=(const complex &);
        double real() const { return re; }
        double imag() const { return im; }
    private:
        double re, im;
    
        friend complex &__doapl(complex *, const complex &);
        friend complex &__doami(complex *, const complex &);
        friend complex &__doaml(complex *, const complex &);
    };
    
    {
           const complex c(1, 2);
           cout << c.real() << endl;
    }
    

    C++の関数伝値
  • pass by valueは、呼び出した関数に値を渡す.このとき、呼び出した関数が値を変更すると、元の変数の値は
  • には変更されない.
    void fun(int a)
    {
        a += 1;
    }
    
    {
        int a = 10;
        fun(a);
        cout << a << endl; // 10 not 11
    }
    
  • pass by reference/pointerは、呼び出した関数で値を変更すると、元の値も変更されます.referenceコンパイラの実装は実際にはconst pointerである.
  • void fun(int a)
    {
        a += 1;
    }
    
    {
        int a = 10;
        fun(a);
        cout << a << endl; // 11 not 10
    }
    

    Operator Overloading
    C++カスタムタイプのいくつかのoperatorは、+,+=,++などのリロードできますが、基本タイプはできません.これは最下位の混乱を引き起こします.
    op  any of the following 38 operators:+ - * / % ˆ & | ~ ! = < > += -= *= /= %= ˆ= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> ( ) [ ]
    
    1) overloaded operator;
    2) [user-defined conversion function](http://en.cppreference.com/w/cpp/language/cast_operator);
    3) [allocation function](http://en.cppreference.com/w/cpp/memory/new/operator_new);
    4) [deallocation function](http://en.cppreference.com/w/cpp/memory/new/operator_delete);
    5) [user-defined literal](http://en.cppreference.com/w/cpp/language/user_literal).
    

    Synatax
    operator op     (1)     
    operator type   (2)     
    operator new
    operator new []     (3)     
    operator delete
    operator delete []  (4)     
    operator "" suffix-identifier   (5)     (since C++11)
    

    Expression
    As member function
    As non-member function
    Example
    @a
    (a).operator@ ( )
    operator@ (a)
    !std::cin calls std::cin.operator!()
    a@b
    (a).operator@ (b)
    operator@ (a, b)
    std::cout << 42 calls std::cout.operator<
    a=b
    (a).operator= (b)
    cannot be non-member
    std::string s; s = "abc"; calls s.operator=("abc")
    a(b...)
    (a).operator()(b...)
    cannot be non-member
    std::random_device r; auto n = r(); calls r.operator()()
    a[b]
    (a).operator
    cannot be non-member
    std::map m; m[1] = 2; calls m.operator
    a->
    (a).operator-> ( )
    cannot be non-member
    auto p = std::make_unique(); p->bar() calls p.operator->()
    a@
    (a).operator@ (0)
    operator@ (a, 0)
    std::vector::iterator i = v.begin(); i++ calls i.operator++(0) in this table, @ is a placeholder representing all matching operators: all prefix operators in @a, all postfix operators other than -> in a@, all infix operators other than = in a@b
    C++一時変数
    C++の一時変数の生成は一般的に関数呼び出しに関連しており、1つの呼び出しが左の値に受け入れられなければ、この変数のライフサイクルがこの文である一時変数を生成することができる.この変数はfunctor,チェーン呼び出し,RAIIに使用されるいくつかの手法でよく用いられる(例えばLogger class).一時変数は実際には左,右と密接な関係があるので,後で詳しく説明する機会がある.
    #include 
    using namespace std;
    
    class Temp {
    public:
        Temp(int t) : t_(t) {}
        ~Temp() { cout << t_ << endl; }
    private:
        int t_;
    };
    
    int main()
    {
        cout << "---------- Begin ----------" << endl;
    
        Temp(1);  // 1
        Temp(2);  // 2
    
        cout << "---------- End ----------" << endl;
    
        return 0;
    }
    
    /*
    output:
    ---------- Begin ----------
    1
    2
    ---------- End ---------- 
    */
    //   1,2 End       ,                    
    

    まとめ
    今回の授業では、過去の知識を完全に整理し、まとめました.なかなかいい感じです.これからもまじめに勉強しなければなりません.