メモ 
概要 
項目 | pod | struct | class | interface | コンストラクタ | o *1 | o | o | x | デストラクタ | x | o | o | x | structメンバ変数 | x | o | o | x | objectメンバ変数 | x | o | o | x | メンバ関数/変数 | o | o | o | o | ガベージコレクタ対象 | x | x | o | o | インターフェースの継承 | x | x | o | o | 公開修飾子(public/private) | x | o | o | x | 代入オーバーロード | x | o | x | x | invariant | x | o | o | x |
1 : 全部0で初期化
interface 
- C#,Dのinterfaceと同じ
- interfaceは複数にinterfaceを継承することができる
- 純粋仮装関数にはabstractキーワードを先頭につける
- <要検討>デフォルト実装を書くことを許す(本当は許さない方が厳密なinterfaceなんですけど)
1
2
3
4
5
6
7
|
-
|
|
|
|
!
| interface IButtonListener
{
abstract void onButtonPush( in IButton sender )const;
void onButtonFocused( in IButton sender )const{}
};
|
class 
- 強制的にobject型を継承している
- 他の言語でよくあるclassの継承は不可
- interfaceは何個でも継承できる
pod 
- plain object data
- C言語のstructに近い
- デフォルトコンストラクタはオブジェクトのメモリ領域を0で初期化する扱いになる
struct 
- 継承のないC++のクラス
- ガベージコレクト対象ではないので参照を保持することができない
型公開修飾子 - public private(class,interface,pod,struct) 
- デフォルトはpublic
- 名前空間直下のprivateな型は同じソース内からしかアクセスができない
1
2
3
4
5
6
7
8
9
10
11
|
-
!
-
|
!
| private pod A
{
};
pod B {
A a; };
|
メンバ公開修飾子 - public private(class,struct) 
- public/privateのみ。protectedは無い。
- デフォルトはpublic
- コロンを使うC++スタイル、メンバ変数・関数に直接記述するJAVAスタイルの両方に対応
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-
|
|
|
|
|
|
|
|
|
|
|
!
| class A
{
public:
void funcPubA(){} private:
void funcPriA(){}
public void funcPubB(){} private void funcPriB(){}
};
|
オーバーライドチェック - override(class) 
不変条件 - invariant(class,struct) 
- (all)Dのinvariantと同じ
- <要検討>structで再帰呼び出しされたらどうしよう(classはカウンタ持たせればいいかな)
委譲 - implement(class) 
- interfaceのデフォルト実装を別オブジェクトに委譲するキーワード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
-
|
|
!
-
|
|
!
-
|
|
|
|
|
|
!
-
|
|
|
|
!
| interface IButtonListener
{
abstract void onPushed();
void onFocused(){}
};
class Hoge : IButtonListener
{
public:
override void onPushed(){}
};
class A : IButtonListener implement mHoge
{
private:
Hoge mHoge = new Hoge();
};
class B : public IButtonListener implement mHoge
{
override void onFocused() { }
private:
Hoge mHoge = new Hoge();
};
|
メンバ関数/変数 (class,interface,struct,pod) 
- (all)C++でいうメンバ関数のconst修飾子はあり。引数リストの括弧の後ろにconstを付ける。
- (all)staticメンバ関数が使える
- (class,pod,struct)staticメンバ変数が使える
- (class,struct)公開修飾子をつけられる
- (class)抽象関数にoverrideキーワードが使える
- (interface)メンバ変数は使えない
- (interface)純粋仮装関数には先頭にabstractキーワードを付ける
- (interface)デフォルト実装はstatic関数として同じ名前の関数が定義される。
1
2
3
4
5
6
7
|
-
|
|
|
|
!
| interface IName
{
string getName(){ return "NoName"; }
};
|
|