* メモ [#u10b9718] #contents * 概要 [#k79548b7] |項目|pod|struct|class|interface|h |デフォルトコンストラクタのユーザー定義|x|x|o|x| |コンストラクタ|o|o|o|x| |デストラクタ|x|o|o|x| |静的コンストラクタ&br;静的デストラクタ|o|o|o|x| |structメンバ変数|x|o|o|x| |objectメンバ変数|x|o|o|x| |メンバ関数|o|o|o|o| |メンバ変数|o|o|o|x| |ガベージコレクタ対象|x|x|o|o| |インターフェースの継承|x|x|o|o| |公開修飾子(public/private)|o|o|o|x| |代入オーバーロード|x|o|x|x| |invariant|o|o|o|x| 1 : 全部0で初期化 ** interface [#s160dc18] - C#,Dのinterfaceと同じ - interfaceは複数にinterfaceを継承することができる - 純粋仮装関数にはabstractキーワードを先頭につける - <要検討>デフォルト実装を書くことを許す(本当は許さない方が厳密なinterfaceなんですけど) #code(c,){{ interface IButtonListener { // 抽象関数(絶対実装) abstract void onButtonPush( in IButton sender )const; // デフォルト実装ありの関数 void onButtonFocused( in IButton sender )const{} }; }} ** class [#gcd95ad1] - 強制的にobject型を継承している - 他の言語でよくあるclassの継承は不可 - interfaceは何個でも継承できる ** pod [#y7b8ef47] - plain object data - C言語のstructに近い - デフォルトコンストラクタはオブジェクトのメモリ領域を0で初期化する扱いになる ** struct [#g20f0c14] - 継承のないC++のクラス・D言語のscope classと同じ - ガベージコレクト対象ではないので参照を保持することができない * 型公開修飾子 - public private(class,interface,pod,struct) [#t6b68232] - デフォルトはpublic - 名前空間直下のprivateな型は同じソース内からしかアクセスができない #code(c,){{ // 同じソース内からしかアクセスできない private pod A { }; // 誰でもアクセスできる pod B // public pod Bと同じ { A a; // 同じソースなのでOK }; }} * メンバ公開修飾子 - public private(class,struct) [#f2079e32] - public/privateのみ。protectedは無い。 - デフォルトはpublic - コロンを使うC++スタイル、メンバ変数・関数に直接記述するJAVAスタイルの両方に対応 #code(c,){{ class A { //--- 公開修飾子(デフォルトpublic) // C++/Dスタイル public: void funcPubA(){} // public private: void funcPriA(){} // private // JAVA/C#/Dスタイル public void funcPubB(){} // public private void funcPriB(){} // private }; }} * オーバーライドチェック - override(class) [#a382e838] - D,C#と同じ * 不変条件 - invariant(class,pod,struct) [#h6f6ff79] - (all)Dのinvariantと同じ - <要検討>structで再帰呼び出しされたらどうしよう(classはカウンタ持たせればいいかな) * 委譲 - implement(class) [#ga454cd5] - interfaceのデフォルト実装を別オブジェクトに委譲するキーワード #code(c,){{ interface IButtonListener { abstract void onPushed(); void onFocused(){} }; class Hoge : IButtonListener { public: override void onPushed(){} }; class A : IButtonListener implement mHoge { // IButtonListenerの関数を全てmHogeに委譲される // implementを使うと自動で次のように展開される // override void onPushed(){ mHoge.onPushed(); } // override void onFocused(){ mHoge.onFocused(); } private: Hoge mHoge = new Hoge(); }; class B : public IButtonListener implement mHoge { // onFocusedの関数だけ実装、その他はmHogeにまかせる override void onFocused() { /* */ } private: Hoge mHoge = new Hoge(); }; }} * コンストラクタ - this() (class,pod,struct) [#ta13d165] - (all)D言語の形式を採用し、関数名はthisを使う - (all)別コンストラクタ関数コールは可能 - (all)どのコンストラクタよりも前に.Initデータをメモリ領域にセットされる(D言語と同じふるまいをする) - (pod)デフォルトコンストラクタは定義できない(0初期化固定) #code(c,){{ class A { public: this() { mY = mX + 1; } this(in int x, in int y) { this(); mX = x; mY = y; } int x = 1; // 直接初期化子がかける(pod,struct限定) int y; // 指定がないとデフォルトコンストラクタが呼ばれる }; }} * デストラクタ - ~this() (class,struct) [#p2eecfc4] - D言語スタイルを採用 #code(){{ class A { public: ~this() { } }; }} * 静的コンストラクタ・デストラクタ - static this(), static ~this() (class,struct,pod) [#o27052fb] - D言語と同じ * メンバ関数/変数 (class,interface,struct,pod) [#l90075b8] - (all)C++でいうメンバ関数のconst修飾子はあり。引数リストの括弧の後ろにconstを付ける。 - (all)staticメンバ関数が使える。 - (class,pod,struct)staticメンバ変数が使える。仕様はD言語と同じ。 - (class,struct)公開修飾子をつけられる - (class)抽象関数にoverrideキーワードが使える - (interface)メンバ変数は使えない - (interface)純粋仮装関数には先頭にabstractキーワードを付ける - (interface)デフォルト実装はstatic関数として同じ名前の関数が定義される。 #code(c,){{ interface IName { string getName(){ return "NoName"; } // こう書くと自動でstatic関数が作られる // static string getName() { return "NoName"; } // IName.getName()でアクセスできる }; }} |