No. | 項目 | 内容 | 備考 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | C++で追加となったキーワード |
追加となたキーワードと概略
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 参照(&) |
でかいオブジェクトを扱うため、参照が主流になった。 ただし、関数の戻り値がローカルの参照渡しなど、データの寿命に注意! void yas(char *ctmp){*ctmp = 'Y';} ←C言語ではこう void yas(char &ctmp){ctmp = 'Y';} ←C++ではこれもできる。ポイント操作による誤作動もない |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | オブジェクトの保護 |
要は、const。 【変数】 const char cYas = 'z'; cYas ='y'; ←NG char &ref = cYas; ←NG ただし、const char &ref = cYas;とすればOK char *const cp1 = new char[5]; ←ポインタは変えれないが、先の内容は書き換えOK const char *cp2 = new char[5]; ←ポインタも、先の内容は書き換えNG 【関数】 const int Yas(){retrun 10;} ←読み取り専用関数となり、内部で変数の変更がNG Yas(const char &pc){} ←参照仮引数のconst宣言。見るだけ! 参照のみとしては都合が悪い場合、クラスのメンバ変数にmutable修飾子を使う。 mutable char cYas; ←cYasメンバ変数は変更できてしまう。 【メンバ関数】 int Yasryu::Get() const; ←クラス定義も同じように、メソッド関数名の後に、const |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | クラス |
【ユーザによるデータ定義】 class cyas{ int a; ←デフォはprivate public: cyas(){a=99;} ←コンストラクタ ~cyas(){} ←デストラクタ int get(){return a;} ←基本、クラス定義内なら、インライン関数。 }; cyas yas1 = new cyas; ←実体化(インスタンス)で、コンストラクタが呼ばれる。 delete cyas; ←デストラクタが呼ばれ、メモリを解放する。 【static】 static int m_yas; ←グローバル定義領域で実体化すれば、オブジェクト間で共通メンバ。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | カプセル化 |
クラスを外部から隠蔽する。 アクセス制御をうまくクラス設計すれば、 friend を使わなくて済む。関連性の極めて高いクラス間では、 publicとするよりも、最低限 friendとした方が安全。
【static】static int yas(void){return iRet;} ←実態はひとつ。 【thisポインタ】 オブジェクト自身の暗黙のポインタ。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | コンストラクタ |
生成時にオブジェクトの初期化を行う。 ・デフォルトコンストラクタ:実装しなければ何もしないこれが呼び出される。 ・引数付きコンストラクタ:実装すれば、引数指定で初期化等可能。 ・コピーコンストラクタ:関数の引数で値渡しの場合に使われる。 代入演算子と違い、生成時のコピーとして走る。 cyas(cyas &org){m_iFlag = org.m_iFlag} cyas Yas2 = Yas1; ← Yas2(Yas1); と解釈される。 ※参考までに代入演算子:cyas &operator=(cyas &org){memcpy・・・} Yas2 = Yas1; ← Yas2.operator=(Yas1); と解釈される。 【シングルトン】 実態が1つしか許さないクラス。①通常、publicのコンストラクタをprotectedとする。②自分自体へのポインタを持ち、protectedとする。③インスタンスを取得するstaticゲッターを用意する。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | デストラクタ |
オブジェクトの消滅を行う。自動的に呼ばれる。newしたものをdeleteする。 特に下記のメモリリークに注意し、気にしなくてもいい設計をする。 ・デフォルトコピーコンストラクタ、デフォルト代入演算子の問題として、メンバ変数にポインタを持つ場合、同じアドレスを示すポインタとなる。このため、デストラクタに、いらないメモリをdeleteする、実態があるものだけ、deleteすることが必要。 ①デフォルトコピーコンストラクタの場合、メンバ変数にポインタがある場合、2個目以降のデストラクタでポインタ先のdeleteで失敗となる。 ②デフォルト代入演算子の場合、代入することで途切れたポインタ先のメモリがリークしてしまう。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | 継承 |
has_a関係:他のクラスを部品として持つ is_a関係:クラスの継承機能を使ったもの 継承されない基本クラス特性:コンストラクタ、コピーコンストラクタ、デストラクタ、代入演算子関数、friend関数 【多重継承】 あいまいさ① 基本クラスTypeAとTypeBの同名Showメソッドのあいまいさをなくした呼び方 A.TypeA::Show(); A.TypeB::Show(); あいまいさ② 間接基本クラスの複数回の継承を抑制するため、仮想基本クラスの宣言で回避。 この場合、アクセス属性として、virtualを使う。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | オーバーロード |
同じメソッド名で、引数が違うもの ・オーバーロードコンストラクタ 引数が違うもの。初期化リスト(基本イニシャライザ)、デフォルト引数 ・演算子のオーバーロード bool yas::operator<(const int &iB) const {if(m_i < iB)return true;return false;}; void yas::operator++(int i){m_i+=i;}; ※constは戻り値の定数化 ※優先順位、結合規則、オペランドの数を変更するような演算子オーバーロードは不可。メンバ変数、ポインタメンバ変数、スコープ解決演算子、3項条件演算子は対象外。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | 仮想関数を用いた動的ポリモーフィズム(多様性) |
仮想関数(virtual)と宣言したメンバ関数は、動的にバインドされる。 class YasBase{virtual Show();}; class Yas::public YasBase{virtual Show();}; Yas yas; YasBase *yasbase = &yas; yasbase.Show(); ← YasのShowメソッドが呼ばれる。これが動的バインド 【仮想デストラクタ】 基本クラスで仮想デストラクタとしておけば、正しいデストラクタが呼ばれ、デストラクタが呼ばれず、メモリリークすることはない。 【オーバーロード関数】 クラス内の静的な関係のメンバ関数のこと。 【関数のオーバーライド】 継承関係にあるクラス間での同名のメンバ関数を上書きすること。 【抽象クラス(インターフェース)】 基本クラスで、下記のようにメソッドを宣言する。実態は継承するクラスで必ず実装しないとエラーとなる。 class YasBase{virtual CalcData() = 0; |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 | assert診断 |
評価した結果がfalseなら、HALTする。 assert(i == 10); ←iが10でなければ、HALT ※デバッグモードのみ(NDEBUG) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12 | テンプレート |
【汎用関数】 1つのアルゴリズム定義で色々な型を表現できる汎用関数。 ※コンパイル時にその型に合わせた関数が作られる。 template <typtename KATA>KATA addone(KATA num){return KATA+1;} int iAAA=10; int i = addone(iAAA); ←i は11 double dBBB=10.1234;double d = addone(dBBB); ←dは11.1234 【汎用クラス】 1つのクラスで色々な型を表現できるクラス。 template <class KATA> class YasArray{ KATA array[10]; Set(KATA aaa,int n){ array[n] = aaa;} } YasArray<short> sArray; ←生成 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13 | STL |
標準連プレートライブラリ(StandardTemplateLibrary = STL) 【STLのコンテナ】
【STLの反復子】
【STLのアルゴリズム】
vector<char> yas; for(int i=0;i<5;i++)yas.push_back('1'+i); vector<char>::iterator pi = yas.begin(); for(;pi != yas.end();pi++)cout << *pi; ←12345と表示される |
---|