int - Bitbucket

Download Report

Transcript int - Bitbucket

C言語によるオブジェクト指向勉強会
七誌
サンプルコード
• 以下からダウンロードしてください。
https://bitbucket.org/7shi/coopben/downloads
• ネットワークがうまくつながらない方はUSBメ
モリをお渡しします。
はじめに
• C++の基本的な構造をC言語で近似して説明
• 実用的なテクニックの紹介ではない
• 期待できる効果(?)
– コンパイラの気持ちに近付く
– コンパイラを作るときの参考になる
• C++03でメンバ関数と継承を説明
– C++11の新機能は使用しない
– テンプレートは対象外
サンプル (1~2)
•
•
•
•
•
•
•
01a.cpp
01b.c
01c.cpp
01d.cpp
01e.cpp
02a.cpp
02b.c
簡単なクラス
01a.cppのC版
01a.cppの関数定義を分離
メンバ関数のオーバーロード
マングリング名で呼び出し
コンストラクタ
02a.cppのC版
サンプル (3~5)
•
•
•
•
•
•
•
03a.cpp
03b.c
04a.cpp
04b.c
05a.cpp
05b.c
05c.c
クラス定義の練習問題
03a.cppのC版(回答例)
デストラクタ
04a.cppのC版
ヒープ(new/delete)
05a.cppのC版
05b.cをヒープ限定で簡略化
サンプル (6~8)
•
•
•
•
•
•
•
•
06a.cpp
06b.c
07a.cpp
07b.c
08a.cpp
08b.c
08c.c
08d.c
static
06a.cppのC版
単一継承
07a.cppのC版
仮想関数
08a.cppのC版(関数ポインタ)
08a.cppのC版(vtable)
08a.cppのC版(サンク)
サンプル (9~12)
•
•
•
•
•
•
•
•
09a.cpp
09b.c
09c.c
10a.cpp
10b.c
11.cpp
12a.cpp
12b.c
仮想関数の練習問題
09a.cppのC版(回答例)
09a.cppのC版(サンク)
多重継承
10a.cppのC版
多重継承のvtableを確認
仮想継承
12a.cppのC版
サンプル (13~15)
•
•
•
•
•
•
13a.cpp
13b.c
14a.cpp
14b.c
15a.cpp
15b.c
仮想継承の練習問題
13a.cppから呼び出される回答例
C言語から仮想関数を呼び出す問題
14a.cppから呼び出される回答例
COM
15a.cppのC版(回答例)
オブジェクト指向とは
• データ型と、それに対する操作をまとめて提
供する枠組み
【例】
データ型
操
作
3, 1, 9, …
合
計
平
均
最初のサンプル
• 関数名は何でも良い
– クラスと関係があるということを示すために接頭
辞を付けているが、文法的な関連性があるわけ
ではなく、単なるコーディング規約
• C++でstructの省略と、C言語のtypedef
• アクセス制御は取り上げない
– すべてpublic
– カプセル化、getter/setterについても同様
• マングリングとの比較
– 以後、関数のオーバーロードは諦める
関数ポインタ (1)
• 変数に対するポインタと同様に、名前の前に
アスタリスクを付けることで表現する。
変数
int a;
関数
int func(int);
ポインタ
int *a;
関数ポインタ
int (*func)(int);
×
※意味が変わるのを避
けるため括弧で囲む int *func(int);
関数ポインタ (2)
int
a ;
型の途中に名前が
割り込んでいる
名
前
型
int (* pfunc )(int) ;
型
名
前
関数ポインタ (3)
• 整数型変数のアドレスをポインタに代入する
のと同じように、関数のアドレスを関数ポイン
タに代入できる
int a;
int *b = &a;
int func(int);
int (*pfunc)(int) = &func;
vtable
• vtableは型ごとに用意される
• 仮想関数をオーバーライドしなくてもvtableは
継承先で作られる
• 2つ目の継承元のvtableは、オーバーライドし
ない限り統合されない
• vtableが差し替えられるため、継承関係は単
純な内包ではない