やす流 Top


C++言語


やっと、やる気が起きたのか。。。まとめてみようと思う。

No. 項目 内容 備考
C++で追加となったキーワード 追加となたキーワードと概略
キーワード 説明
asm アセンブラを記述するときに用いる
bool,true(1),false(0) ブール値を表す整数型
wchar_t 16bitのワイド文字型(unsigned short)
try
catch
throw
例外メカニズム
class クラス型
new,delete 動的なメモリ割り当て、メモリの開放
explicit コンストラクタの1つしかない引数の暗黙変換を禁止させる
volatile 変数のコンパイラによる最適化を抑止
frind アクセス制限の解除
inline インライン展開をしたいとき
mutable
(ムータブル)
const属性のオブジェクトのメンバ変数を解除できる
namespace
using
マルチベンダーで識別子競合の問題を回避するため
char yas;//グローバル →::yas
namespace data1{char yas;}//→data1::yas
namespace data2{char yas;}//→data2::yas
namespace betumei = data1;//エイリアス宣言
using namespace data1;
using namespace data1::yas; ←こっちの方が曖昧さはなくなる
operator C++の演算子であるようなクラスのメンバ関数をオーバーロードする際に使用。
int operator +(int a)
{
   retrun num + a;
}
this メンバ関数を呼び出したオブジェクトを示す暗黙的なポインタ
※staticメンバ関数で使えない。
typeid 実行時にオブジェクトの型を識別するための演算子
※実行時型識別(RunTimeTypeIdentification=RTTI)

const type_info& tinfo = typeid(*yas);
クラス名:tinfo.name 比較:yas != yas2
dynamic_cast 動的なキャスト
static_cast 静的キャスト(コンパイル時に解決)
const_cast 静的キャスト
const,volatile属性の追加、削除
reinterpret_cast 静的キャスト(低レベルなキャスト)
ポインタと整数をキャスト。使わないことが望ましい
virtual 【仮想関数宣言】動的バインディング
例えば、基本クラス→継承クラスのデストラクタを仮想関数とすれば、オブジェクトに合わせて、動的に実行されるデストラクタが、基本クラスか継承クラスが決まる。
class superyas{virtual show(){xxx};};
class yas:public superyas{show(){yyy};}\\;

【仮想基本クラス宣言】仮称継承
継承の重複を回避するため
class yas : public virtual superyas{
template テンプレート。 【汎用関数】【汎用クラス】
extern "C" Cコンパイルしたモジュールをリンクする場合
extren "C"{yas(int a,int b);}
※C++コンパイラはオーバーロードを解決する仕組みがあり、これをCモジュールに当てはめるとラベルが解決できない。このため、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とした方が安全。
アクセス属性 説明
private 外部に非公開。クラスのデフォルトはprivate
protected 派生クラスを除き、非公開
public 外部に公開。構造体、共用体のデフォルトは public

【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のコンテナ】
コンテナクラス名 説明
bitset ビットシーケンスをビットセットとして管理する
deque 2つの終端を持つキューの管理を行う。
list 双方向の1次元リスト管理を行う。
map 特定キーとデータの結合管理を行う。
multimap 特定キーとデータの結合管理を行う。
multiset 要素の組み合わせ管理を行う。
queue キューの管理を行う。
set 一意の要素の組み合わせ管理を行う。
stack スタックの管理を行う。
vector 動的な配列管理を行う

【STLの反復子】
反復子 意味
入力反復子 値を取得する。インクリメントできる。
出力反復子 値を取得する。インクリメントできる。
順方向反復子 値を取得/格納する。インクリメントできる。
双方向反復子 値を取得/格納する。インクリメントとデクリメントができる。
ランダムアクセス反復子 値を取得/格納する。
アドレス捜査でランダムアクセス可能

【STLのアルゴリズム】
アルゴリズム 用途
copy シーケンスをコピーする
count シーケンス内部の要素の数を数える
equal 2つのシーケンス範囲の一致を調べる
find 指定範囲内の値を検索する
includes シーケンスのすべての要素が含まれるかどうかを調べる
max 最大値を求める
mearge 2つのシーケンスをマージする
min 最小値を求める
next_permutation 昇順順列を作成する
prev_permutation 降順順列を作成する
search シーケンス内部で下位のシーケンスを検索する
sort シーケンスを分類する
swap 2つの値を入れ替える

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と表示される