このページの内容 |
---|
bool (論理型) |
char (文字列型) |
int (整数型) |
double (浮動小数点型) |
const と ポインタ |
リファレンス |
ありがたいスポンサー様 |
---|
C++ では、論理型が定義されている。bool値は、true か false をとることができる。
bool blnIsOk = true ;
bool型を整数に変換すると、true は 1 、false は 0 になる。整数やポインタをbool型に変換すると、0のとき false 、0以外の値のとき true に変換される。
sizeof(char) ≦ sizeof(bool) である。
Win32 プログラムで使用する BOOL型は windef.h(windows.h でインクルードされる) の中でtypedef int BOOL;としとして定義されている。typedef int bool;としない最大の理由は、C言語を使って Win32 プログラミングができるようにするためだろう。また、将来 BOOL型の定義が変更・拡張されても対応できるように、C++プログラマであっても Win32 プログラミングをするときは、 bool ではなく BOOL を使ったほうがよいだろう。例えば、Win16 と Win32 とではWPARAMの型が変化した(Win16ではshort, Win32ではlongになった)が、WPARAMと記述していればこのような変化にも対応できた。このように、Microsoft 定義の型を使っていると、将来的な仕様変更にも対処できるようになる。というか、対処できるように仕様変更されるはずである。ここらへんは、Microsoft頼みといったところですが。
char型は8ビットと考えても問題ない。文字をシングルクオート(')で囲った場合は 『文字リテラル』 を表し、char型を与える。
char c = 'a'
符号の有り無しは、unsigned char(0 から 255) または、signed char(-128 から 127) で宣言すれば指定できる。単純に修飾なしの char と宣言した場合に signed になるか unsigned になるかは定義されていない。これは、char型を int型にキャストしたときに環境依存が発生し、移植のときに潜在的な問題を引き起こす可能性があることを意味する。
整数型は、符号の有り無しでsigned intとunsigned intに分類される。単に、intと宣言した場合は、符号付きになる。また、signed intはsigned、unsigned intはsignedと省略できる
整数型をサイズで分類すると、小さい順にshort int,int,long intとなる。short intはshort、long intはlongと省略できる。
符号とサイズを同時に指定する場合は順番を問われない。つまり、unsigned long int と long unsigned int は同じである。
数値の先頭に 0 がつくと 8進数、0x がつくと16進数を表す。例えば、255 = 0xff = 0377 である。unsignedリテラルであることを明示的に示すにはサフィックスUを使う。longリテラルであることを示すにはサフィックスLを使う。
2 // int 2L // long 2U // unsigned int
小さいものから、float(単精度)、double(倍精度)、long double(拡張精度) がある。float型のリテラルを表すためにサフィックスfまたはFが存在する。
const は、宣言する変数の意味付けを行うので積極的につけるべきである。const をつけられて定義された変数を変更しようとすると、コンパイル時のエラーとなり、開発者に注意させる。これは実行時に予期せぬ事態を生むことを防ぐことができるので、トータルでみると開発効率が上がることとなる。
const int* p1は、p1が定数を指すポインタであることを表す。p1++;は実行でるが、*p1 = 3 ;は実行できない。
int* const p2は、p2が指し示すアドレスが変わらない(ポインタ定数である)ことを表す。p2++;は実行できないが、*p1 = 3 ;は実行できる。
const int* const p3は、p3が定数を指し、指すアドレスも不変であることを表す。p3++;も*p3 = 3 ;も実行できない。
次のように、右から左に英語読みをすると覚えやすいでしょう。
p1 is a const pointer to a int. p2 is a pointer to a const int. p3 is a const pointer to a const int.
厳密には、*constが、ポインタ定数を意味するための宣言に用いられる。
リファレンスは、すでに実体のあるオブジェクトの別名であることを表す。そのため、初期設定でどのオブジェクトを指し示すかを指定する必要がある。
string s = "hoge fuga haga";
string& strRef = s;
string& strRef2; // エラー。初期設定されていない。
リファレンスは、参照するオブジェクトと同等に扱える。例えば、次のようなコードは正しい。
string s = "hoge fuga haga"; string& strRef = s; strRef += "kenji"; printf( strRef.c_str());
そのため、リファレンスはポインタ定数であると考えてよいだろう。ポインタ定数であるので、参照先のアドレスを変更することはできないが、参照するオブジェクトは変更することができる。すぐ上のコードは次のように書き換えられる。
string s = "hoge fuga haga";
string* const pstr = &s;
*pstr += "kenji";
printf( (*pstr).c_str());