2009-07-01から1ヶ月間の記事一覧

正規表現を実装する 第三回「?量化子」

正規表現を実装する 第一回「リテラル」 - (void*)Pないと 正規表現を実装する 第二回「任意の一文字」 - (void*)Pないと 第三回は、ある文字が0個か1個あればマッチする「?」を実装します。これは割とややこしそうです。 int MyRegex::match_main(const cha…

正規表現を実装する 第二回「任意の一文字」

正規表現を実装する 第一回「リテラル」 - (void*)Pないと 第二回は任意の一文字にマッチする「.」(ドット)を実装してみたいと思います。 int MyRegex::match (const char* str,const char* regex) { if ( !*regex ) return 1; return this->match_main(st…

演算子のオーバーロードを利用したコピー禁止のオブジェクト

C++

http://www.geocities.jp/ky_webid/cpp/language/017.html インスタンスをコピーする手段には、代入演算の他に、コピーコンストラクタによるものもあるので、この2つを封じることができれば、コピーは禁止できます。これらを封じる方法は、両者を private …

単項演算子のオーバーロード

C++

http://www.geocities.jp/ky_webid/cpp/language/017.html単項の演算子、例えばインクリメントや-1とか+1といった符号などのオーバーロードも可能です。試してみます。 #include <iostream> class CNum { public: int m_num; CNum (int num); int getNum(); CNum opera</iostream>…

+=演算子のオーバーロード

C++

http://www.geocities.jp/ky_webid/cpp/language/017.html通常、+演算子だけをオーバーロードすることは稀のようです。 +をオーバーロードするなら+=もやっておきましょう。結局のところ、書き方の違いだけでやりたいことは同じですからね。 #include <iostream> class</iostream>…

16章 演算子のオーバーロード

C++

http://www.geocities.jp/ky_webid/cpp/language/017.html名前からして凄そうなのが出てきましたね。これは非常にややこしそうな臭いがぷんぷんします。 +や-といった演算子の振る舞いを変えてしまうんだそうです。なんだかスゴイですね。とりあえずオブジェ…

ハッシュ実装の話

C

次の内部ハッシュの実装(C言語のプログラムの一部)には誤りがある。誤っている部分を正しく修正せよ。ただし、Bはハッシュ表のサイズ、hashはハッシュ関数である。ハッシュ表の要素は正の整数とし、要素の個数はハッシュ表のサイズBより小さいとする。 本…

thisポインタ

C++

クラスのメンバ関数内でのみ使用できるthisポインタというものがあります。これはそのクラスのインスタンス自身を表すポインタだそうです。 #include <iostream> class CClass { public: int m_num; CClass(int); int getNum (); }; CClass::CClass (int num) { this-></iostream>…

正規表現を実装する 第一回「リテラル」

正規表現とはある文字列のパターン一致するかどうかをチェックするものです。正規表現 - Wikipedia今回これを自分で実装してみようと思います。当然、もうすでにCで作られた素晴らしい正規表現ライブラリがあるらしいのですが、勉強用として何も見ずにC++で…

const付の変数をconst無しの関数とかに渡したい場合

C C++

ってどうするのが一番なんだろうか。例えばこういうコード int func (const char* s1,const char* s2) { char* p; p = strstr(s1,s2); if ( p == NULL ) return 0; return 1; } main.cpp(5) : error C2440: '=' : 'const char *' から 'char *' に変換できま…

15章 参照

C++

http://www.geocities.jp/ky_webid/cpp/language/015.html参照という物が出てきました。ポインタと非常に似ていますね。面白いのが、間接参照を行わなくて良いというところです。ポインタの場合はあくまでアドレスを渡しているだけなので間接参照して実体を…

14章 protected

C++

http://www.geocities.jp/ky_webid/cpp/language/014.html第6章のときに放置されていたprotectedというアクセス指定子の話です。話は単純です。そのクラス単体で見れば単なるprivateと同じ振舞いになります。ではprivateと何が違うのかというと、そのクラス…

継承時にメンバ変数を上書きした場合

C++

オーバーライド関連で少し気になったので試してみました。メンバ関数ではなく、メンバ変数を上書きしたらどうなるのかな?と思って以下のコードを書いてみました。 #include <iostream> class CSuper { public: int m_i; CSuper(); void csuper_call(); }; class CSub </iostream>…

13章 包含と連鎖

C++

http://www.geocities.jp/ky_webid/cpp/language/013.htmlなにやら難しそうな単語が出てきました。「ほうがん」と読むらしいです。要はクラスのメンバに別のクラスを持つということでしょうか。連鎖というのは単に他のクラスのメンバ関数を呼ぶだけっぽいで…

16章 コピーコンストラクタ

C++

http://www.geocities.jp/ky_webid/cpp/language/016.htmlまたまたややこしそうなものが出てきました。C++は新しい概念が沢山ありますね。C言語でも割と結構いっぱいいっぱいだったので先が思いやられます。とにかく良く読んでいったいどういうものなのかを…

最近ペースが落ちてきた

やばい、基本的に最低一日一記事目指してたんだけどちょいペースが落ちてきた・・・。

12章 newとdelete

C++

http://www.geocities.jp/ky_webid/cpp/language/012.htmlC++ではmallocの変わりにnewとdelete演算子を使います。簡単に言えばnewがmallocでfreeがdeleteみたいなもんです。 #include <iostream> int main () { int *p; p = new int(); *p = 123; std::cout << *p << s</iostream>…

オーバーロードされたコンストラクタと継承

C++

http://www.geocities.jp/ky_webid/cpp/language/011.htmlまた更にオーバーロード関係でややこしい仕様があります。それはコンストラクタです。コンストラクタは継承順に個々のコンストラクタが自動的に呼ばれるため、引数の個数が違うとどうやって次のコン…

オーバーロードと継承

C++

http://www.geocities.jp/ky_webid/cpp/language/011.htmlなんか色々な機能が一気に流れ込んできていろいろ頭がこんがらがってきたんですが・・・。なんとかやりましょう。継承間でのオーバーロードはできません。どういうことかというと下記の例を見てくだ…

コンストラクタのオーバーロード

C++

http://www.geocities.jp/ky_webid/cpp/language/011.htmlコンストラクタもオーバーロードが可能です。ってやっぱりコンストラクタには引数が渡せたんですね。まずそのやり方ですが、以下のよう書きます。 #include <iostream> class CClass { public: CClass(int); };</iostream>…

11章 オーバーロード

C++

http://www.geocities.jp/ky_webid/cpp/language/011.htmlお次はオーバーロードの話です。オーバーライドとは別物です。名前がややこしいですね。同じ関数名でも、引数の型が違えば定義できるというのがオーバーロードです。これは便利ですね。C言語のときは…

純粋仮想デストラクタ

C++

http://www.geocities.jp/ky_webid/cpp/language/010.htmlなんか色々組み合わせが凄いですね。もはや何がしたいのか良く分からないですね。これ。 純粋仮想デストラクタを使うこと自体が稀ではありますが、どうしてもインターフェースクラスを作りたいが、純…

10章 インタフェースクラス

C++

http://www.geocities.jp/ky_webid/cpp/language/010.htmlメンバ関数の宣言だけ書いて実際の定義はサブクラスに任せるクラスのことをインタフェースクラス(抽象クラス)といいます。仮想関数に「=0」というのをつけると宣言だけができるそうです。なんだそ…

strftime関数でフォーマット指定して日付の出力

C K&R

K&R本 付録B10printfのようなフォーマット指定子で日付の出力ができるみたいです。さっそくやってみました。 #include <stdio.h> #include <time.h> int main (void) { time_t t = time(NULL); struct tm tm; char str[81]; localtime_s(&tm,&t); strftime(str,sizeof(str),"%</time.h></stdio.h>…

継承におけるコンストラクタとデストラクタの呼び出し順序

C++

http://www.geocities.jp/ky_webid/cpp/language/008.htmlスーパークラス、およびサブクラスともにコンストラクタやデストラクタが存在していた場合、どのクラスのものが呼ばれるのでしょうか?実際に動かしてみます。 #include <iostream> class CBase { public: CBas</iostream>…

8章 継承

C++

http://www.geocities.jp/ky_webid/cpp/language/008.htmlなかなかややこしい話ですが、これはあるクラスのメンバ変数や関数を全て引き継いだ新しいクラスを定義できるということでしょうか。とにかくやってみましょう。実際に動かしてみるのが一番早いです…

コンストラクタで仮想関数呼び出しても適用されない

C++

http://www.geocities.jp/ky_webid/cpp/language/009.htmlコンストラクタ内ではオーバーライドの効果が出ないようですね。 #include <iostream> class CBase { public: CBase(); virtual void foo (); void call (); }; class CSub : public CBase { public: void foo </iostream>…

多態性

C++

http://www.geocities.jp/ky_webid/cpp/language/009.html継承関連で重要なものがこの多態性というものです。簡単に言えば、サブクラス型の変数はスーパークラス型のポインタ変数に代入可能という話です。実際に見てみましょう #include <iostream> class CBase { publ</iostream>…

9章 オーバーライド

C++

http://www.geocities.jp/ky_webid/cpp/language/009.html前回継承というものを学びました。今回このオーバーライドというものなのですが、継承したサブクラスでスーパークラスと同名のメンバ関数を定義し、上書きできるというもののようです。とにかくまず…

5章 クラス

C++

http://www.geocities.jp/ky_webid/cpp/language/005.htmlクラスの話が出てきました。ここからがC++の本番といった感じでしょうか。と、そのまえにC++における構造体の話もありました。C++は構造体もクラスも殆ど同じとのこと。さらにstructやenum、unionと…