http://tomoyaonishi.hatenablog.jp/entry/2014/07/01/メソッド、クラス、変数、定数宣言時に使えそうRead less
ボックス化(boxing)[1]とは、プログラミング言語において値型をオブジェクト型(参照型)に変換すること。逆に、ボックス化されたオブジェクトを値型に戻すことをボックス化解除(unboxing)[2]と呼ぶ。 Javaや.NET Frameworkなどの環境においては、値型(Javaではプリミティブ型[3]がこれに相当する)と参照型という根本的に異なる二種類の型が存在する。参照型のインスタンスはヒープ上の独立した領域に確保される。値型は文脈によって確保される場所は異なるものの、いずれにせよメモリ上に連続的に確保される(例えば、ローカル変数として宣言された場合はスタック上に確保され、参照型のメンバとして宣言された場合は参照型の一部として確保される)。 このように値型と参照型とは根本的に性質の異なるものであるが、さまざまな理由により、値型を参照型に型変換して運用することが必要となる場合がある
Cが全然分からないころの話。 javaのように1クラス1ファイルに書かないのはなんで? メンバがポインタばっかりなのはなんで? という疑問を持ちながらコーディングしてるともやもやして嫌でした。 もやもやがいやなのでjava風に書いていたら当然のように詰まりました。 ポインタじゃなかったらメモリが大変なことになるだろうが! というのは最もなんですけど、じゃ小さいプログラムならありなのか?スマートポインタ使えばいいのか?と言うとそうでもない。 今日書いてみたいのは、クラスは相互参照がめんどくせぇから分割しろ。そして同じ理由でメンバ変数はポインタにしとこうぜ、というお話。 相互参照の解決 AクラスがBクラスを使って、BクラスがAクラスを使う。 こういう状態を相互参照とか相互includeとか言うと思う。 javaは何でもないことだけど、C++はこれを簡単には許してくれない。 相互参照の解決方法に
CRTPについてちまちま書いていたのをまとめてみました. CRTP(Curiously Reccursive/Reccuring Template Pattern)とは以下のように基底クラスのテンプレート引数として自分自身を代入するテクニックのことを指します. template class Base{/*.....*/}; class C : public Base{/*.....*/}; よく見かけるパターンなので,これがどういう使われ方をしているかを適当にまとめてみました. あるクラスの機能の一部を変えてコードの再利用を行う場合,変えたい機能を提供するメンバ関数を仮想関数にしてそれを派生クラスでオーバーライドするのが通常の方法ですが,CRTPを使えば仮想関数を用いずに行うことができます. 自分で何か良さそうな例を書こうと思ったのですが,あんまり適切な例が思い浮かばないので,このCRTP
オブジェクトの型を知る C++のようなオブジェクト指向言語では、ポリモーフィズムをサポートしています オーバーライドで知ったように、場合のよっては実行されるまで性質がわからないオブジェクトが存在します この柔軟性はプログラムの効率に非常に大きな影響を与えます しかし、実行中に現在のオブジェクトの型を知る必要があるケースもあります といって、コンパイル時にオーバーライドされた仮想関数の型を知ることはできません そこで実行時型情報という機能を用いて、実行中にその型を調べる必要があります 実行時型情報は RTTI(Run-Time Type Identification) とも呼ばれます この機能を用いることで、ポリモーフィッククラスの型の操作などが動的に行えます 実行時型情報を得るには typeid 演算子 を用います この演算子は const type_info & を返します type_i
アロー演算子をオーバーロードして別のオブジェクトのポインタを返す処理があるとします。 以下のような感じです。 #include <iostream> using std::cout; using std::endl; class CMember { public: void output () { cout << "CMember::output" << endl; } }; class CClass { private: CMember* m_pCmember; public: CClass () { m_pCmember = new CMember; } ~CClass () { delete m_pCmember; } // アロー演算子をオーバーロードして別のオブジェクトを返す CMember* operator->() { return m_pCmember; } void ou
http://www.geocities.jp/ky_webid/cpp/language/020.html C++のconstには状況よって様々な効果があるので少しややこしいです。 とりあえずひとつずつ理解していきたいと思います。 まずはC言語的なconstについてですが、これは単にその変数、もしくはその変数が参照している値を変更不可にすることができます。 const int i = 100; // iの値を変更できない int* const p; // pの値を変更できない const int* p; // pが指している値を変更できない const int* const p; // pの値を変更できなくて且つ指してる値も変更できない C++ではこれ以外にconstの役割がかなり増えました。 ひとつずついきましょう。 まずはメンバイニシャライザについてです。 メンバ変数にconstを適
C++初心者です。 とんちんかんな質問をしていたらすみません。 A_file.cppとB_file.cppというファイルがあり、それぞれの中でAとBというクラスを定義していると仮定します。 このとき、クラスAのメンバ変数としてBのインスタンスを持たせる場合、ポインタとして定義する方法(以下ソースのmember_pointer_B)と実体を定義する方法(以下ソースのmember_B)があると思いますが、これらの違い(なぜこのような2つの方法があるのか、そもそも言ってることがおかしいとか、使い方が違うとか、メリット・デメリットとか)を教えて下さい。 // ソース class A { int numberA; int numberAA; B* member_pointer_B; // ポインタの定義 B member_B; // 実体の定義 } 宜しくお願い致します。
オブジェクト指向言語では、なぜnewでインスタンスを生成するのでしょうか。C言語の構造体のように、newせずに「クラス名 hoge;」 を書くだけで、インスタンス生成と初期化(newの処理)をしてくれればいいのに。 オブジェクト指向言語では、なぜnewでインスタンスを生成するのでしょうか。C言語の構造体のように、newせずに「クラス名 hoge;」 を書くだけで、インスタンス生成と初期化(newの処理)をしてくれればいいのに。 例えば、 Class Dog { 略 } としてDogを定義して、コードの中で Dog pochi; と書くだけで、pochiインスタンスを生成(コンストラクタの実行)をしてほしいのですが、なぜ pochi = new Doc() みたいに、別途書かなければいけないのでしょうか。
c++ 静的クラスについて。 static class classname { int a; void func(); ..... }; 等と宣言すれば、classnameクラスのメンバは変数も関数もすべてstaticの属性を帯びると思っていたのですが、通常のクラス内でstatic変数を宣言した時のように、クラス外で再宣言する必要がないのはなぜですか? そういうもんだからなのか、それとも実はstatic class内のメンバすべてがstaticであるということが思い違いなのか。。。 ご回答よろしくお願い致しますm(_ _)m k032yfさん 確かにそうなんですが... 「static class内の関数にスコープ解決演算子をあてたclassname::func() = グローバル関数func()」という認識で用いると、「静的でないメンバ参照は特定オブジェクトを基準にした相対参照で」という
構造体って? C 言語で、いくつかの変数をひとまとまりにしたものを構造体といいます。例えば、下のように struct を使って定義します。 typedef struct Item { int code; /* 商品コード */ int name; /* 商品名 */ int price; /* 価格 */ } ITEM, *LPITEM ; 商品コードと商品名と価格を管理する場合、code, name, price の変数をそれそれ作るよりも商品( Item) でひとまとめすることでプログラムがわかりやすくなります。こういったまとまったデータをレコードともいいます。プログラムが小さいと大げさなように感じされますが、複雑になるにまし、struct のありがたみがわかります。 では C++ の構造体はというと、同じように使えます。C++ はCのソースコードをそのままコンパイルできるようになって
概要 静的メンバー(static member)とは、 特定のインスタンスにではなく、クラスに属するフィールドやメソッドのことです。 そのため、静的変数のとこをクラス メンバーとも呼びます。 (クラス変数という呼び名の方が意味合い的には正しいのですが、 C言語から派生したというC#の歴史的な背景のため、静的変数という呼び方をします。) 「静的」という言葉は、各種メンバー(フィールド、メソッド、プロパティなど)それぞれに対して、静的フィールド、静的メソッド、静的プロパティ、… などという使い方もします。 また、静的メンバーとの区別を明確にしたい場合には、通常のメンバー変数のことをインスタンス メンバーと呼びます。 ポイント 静的メンバー: この呼び方は歴史的なもので、実際にはクラス メンバー(クラス メソッド、クラス フィールド)と呼ぶ方がいいかも。 static キーワードをつけると静的メ
サルにもできるiPhoneアプリの作り方使うだけじゃもったいない! iPhoneをとことんに遊び倒すために「誰でも」「簡単に」「自分だけの」アプリを作れるようになるための、とっておきのノウハウを教えます。 さぁアナタもご一緒に。世界に1つだけのオリジナルアプリを作りましょう!チャレンジブログ/エンジニア 携帯でもサルでき!Objective-C入門その7:アクセサメソッドをマスターするObjective-C入門 今回はObjective-C 2.0から実装された新機能についてのお話です。 前回まで、クラス、インスタンス変数、メソッドと、宣言シリーズについてお話ししてきました。 もう1回復習したい方はこちらを読んでくださいね。 Objective-C入門その4:クラス宣言をマスターする Objective-C入門その5:インスタンス変数宣言をマスターする Objective-C入門そ
int型の配列を使うときは以下のようにします。これは問題ないですね。 int[] array = new int[10]; // (1) しかし自分で定義したクラスのオブジェクトの配列を使う場合は、同じようにしてもうまくいきません。 class NewClass{ int a; int b; } public static void main(String[] args) { NewClass[] dim = new NewClass[3]; // (2) dim[0].a = 1; dim[0].b = 10; dim[1].a = 2; dim[1].b = 20; dim[2].a = 3; dim[2].b = 30; } (1)と同様に(2)と書いたのに、これを実行するとNull Pointer Exceptionが発生してしまいます。 調べたところ、(2)は、オブジェクトを入れ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く