C++
ある程度、C++のオーバーロードについて学んだ。 自分で演算子の内容を定義できるのは面白い。 でもあまりやりすぎるとわけがわからなくなりそうだ。 自分で定義した型ならある程度はいいだろうが、すでにある型の演算子を変えてしまうと混乱してしまうだろ…
C++では()演算子までオーバーロードできてしまう。()演算子をオーバーロードするということは新しい関数呼び出しを作っている感じ。 #include <iostream> using namespace std; class Test { int mNum; public: Test() { mNum = 0; } void operator()(int i) { mNum = </iostream>…
配列の添え字を指定するのにつかう演算子もオーバーロードできる。 オーバーロードした例が次の通り。operator()関数の戻り値を参照とすることによって代入文の左側にも使えるようにしている。 #include <iostream> using namespace std; const int SIZE=10; class Tes</iostream>…
関係演算子(==やオーバーロードの場合は判定結果によってtrueやfalseを返すように実装すればよい。 オブジェクトが等しいか判定する==演算子をオーバーロードした例が次の通り。 #include <iostream> using namespace std; class Test { int mNum; public: Test() { mN</iostream>…
インクリメントなどの単項演算子もオーバーロードできる。やり方は普通の演算子とほぼ変わらないが、インクリメントやデクリメントには前置き、後置きの2種類があるので注意が必要。 たとえば++演算子をオーバーロードするとき前置きのプロトタイプは次の通…
C++でファイルを読み込むにはifstreamを使えばよい。 ファイルを読み込む処理は次のような感じ。 #include <iostream> #include <fstream> using namespace std; char* openFile( const char* name, int* fileSize ) { ifstream inputFile( name, ifstream::binary ); if ( !inp</fstream></iostream>…
演算子のオーバーロードをそのクラスのメンバ関数とせずにフレンド関数として定義することもできる。 #include <iostream> using namespace std; class Test { private: int value; public: Test() { value = 0; } Test(int n) { value = n; } friend Test operator+(T</iostream>…
本を読みながらC++の勉強。10ページ。今回は演算子のオーバーロードについて。 演算子のオーバーロードは次のような形式で定義する。 型 クラス名::operator#(引数) { } #の部分にオーバーロードしたい演算子が入る。たとえば+や=など。 実際に3次元ベクトル…
引き続き、本を読みながらC++の勉強。8ページ。 オブジェクトがコピーされるときの動作を指定する関数。たとえばTestクラスのコピーコンストラクタの定義は次の通り。 Test(Test const&); コピーコンストラクタは初期化が行われるときに実行される。初期化が…
引き続き本を読みながら勉強中。 オブジェクトを返す関数がある場合。 #include <iostream> using namespace std; class Test { public: Test() { cout << "Constructor\n"; } ~Test() { cout << "Destructor\n"; } }; Test func() { Test t; return t; } int main() {</iostream>…
C++の本を読みながら勉強。7ページ。 オブジェクトを関数で値渡しするときに注意すること。 #include <iostream> using namespace std; class Test { public: Test() { cout << "Constructor\n"; } ~Test() { cout << "Destructor\n"; } }; void func(Test t) { } int </iostream>…
標準ライブラリ関数のclock()を使うとプログラムの実行開始時間からの経過時間を取得できる。 clock()の戻り値をCLOCKS_PER_SECで割ると秒数にすることができる。 #include <ctime> void func() { clock_t t = clock(); int seconds = t / CLOCKS_PER_SEC; }</ctime>
引き続き本を読みながら勉強。3ページ。 #include <iostream> using namespace std; class TestB; class TestA { private: int m_value; public: TestA(int num) { m_value = num; } friend void func(TestA a, TestB b); }; class TestB { private: int m_value; publ</iostream>…
本を読みながらC++の勉強中。2ページ。 今回はフレンド関数について。 friendキーワードを付けた関数はクラスのprivateメンバへのアクセス権がある。 class Test { private: int m_num; public: Test(int num) { m_num = num; } friend void func(Test t); }…
C++の本を読みながら勉強。4ページ。 クラスのコンストラクタに複数の引数があるときは次のような感じで初期値を設定してオブジェクトの配列を作成できる。 #include <iostream> using namespace std; class Point { int m_x; int m_y; public: Point(int x, int y) { </iostream>…
C++の本を読みながら勉強。3ページ。インライン関数について。 inline修飾子を付ければインライン展開される。でもあくまでコンパイラに対する要求であり、必ずインライン展開されるとは限らない。 となると自分であえてinlineを付ける必要はないのではない…
C++の本を読みながら勉強。コンストラクタとデストラクタについて。9ページ。 そこで初期化の代用法を初めて知った。 コンストラクタが1つの仮引数をとる場合は次のようにかける。 #include <iostream> using namespace std; class Test { int num; public: Test(int x</iostream>…
本を読みながらC++の勉強中。今日はコンストラクタとデストラクタ。 最近、デストラクタにvirtualをつけるという話がブログで話題になっていた。いまいち理解しておらず、今まではとりあえず何も考えずにvirtualを付けていた。仮想関数とかポリモーフィズム…
型名を付けない共用体。 #include <iostream> using namespace std; int main() { union { int i; char c[4]; }; c[0] = 'A'; c[1] = 'B'; c[2] = 'C'; c[3] = 'D'; cout << hex << i; } 実行結果 44434241 この例ではint型のiとchar型配列のc[4]が同じメモリーを共有</iostream>…
共用体は複数の変数が同じメモリーを共有するもの。 union test { int i; char c; }: int main() { test a; a.i = 100; } この共用体testの場合、iとcは同じメモリーを使用する。 また、サイズが異なる型の場合は最も大きい種類の分だけメモリーを使用する。…
昨日のなぜアロー演算子があるかという疑問を書いたが、それの回答が「ロベールのC++入門講座」に書いてあった。 p->aという文は(*p).aとアロー演算子を使わなくても書ける。が、p->aのほうが見やすいじゃんという話。 このような見やすくする構文をシンタッ…
ビットフィールドは構造体のメンバのサイズをビット単位で指定する方法。 struct mydata { unsigned a : 3; unsigned b : 1; }; この場合、aは3ビット、bは1ビットのサイズとなる。
構造体を関数に渡したり、戻り値として受け取ったりする場合、値渡しだとコピーが発生するので、参照渡しにしたほうが処理が軽くなる。 ということで、参照渡しを使ったコード。 #include <iostream> using namespace std; struct point { int x; int y; }; point &fun</iostream>…
C++で日付や時刻を扱うにはヘッダに関係する関数が用意されているので、それを使う。 time()関数で現在の日付と時刻がtime_t型で得られる。time_t型はlong int型で定義されている。これから月や分、秒などを得るにはtm構造体を用いる。tm構造体はVisualC++で…
関数の引数に構造体を使うと値渡しとなる。 struct point { int x, y; }; void func(point p) { ... } void main() { point pos; func(pos); } 値渡しなので、構造体の内容すべてがコピーされる。上のようなプログラムならサイズが小さいから、それほど問題…
構造体の定義は次のようにして宣言する。 struct player { int hp; int mp; }; 実際にメモリに割り当てられたこの構造体の変数を宣言するには次の通り。 player test; test.hp = 100; test.mp = 100; 各メンバにアクセスするにはピリオドを使う。 定義といっ…
型や変数のサイズを取得するためのコンパイル時演算子。 型の場合は括弧が必要で、変数の場合は括弧を付けなくてもよい。 sizeof(int); int value; sizeof value; 変数の場合に括弧を付けなくてもいいとは知らなかった。今までずっと括弧を付けて書いていた…
参照を使いましょうというエントリ。 参照が使えるときはいつでも参照を使いましょう - 神様なんて信じない僕らのために どうも、私は参照について理解が浅く苦手意識があり、普段ほとんど使うことがない。 このエントリを読んで、参照についての理解がちょ…
ちょっとしたテストプログラムを書こうと思って、Visual C++ 2005 Express Editionでコーディング。入出力にcin,coutを使おうとしたらコンパイルエラーが。 #include <iostream> int main() { cout << "test" << endl; }cin,coutはstdというnamespaceで定義されている</iostream>…
多重継承したクラスのインスタンスを作成して、そのポインタを親クラスのポインタに代入すると継承順番によって値が異なる。 #include <stdio.h> class BaseA { }; class BaseB { }; class Test : public BaseA, public BaseB { }; int main() { Test* pTest = new Te</stdio.h>…