データ型
bool 型
C++ では論理型である bool 型が導入されました。
bool 型のリテラルは,真を表す true と,偽を表す false です。
int main()
{
bool b = true;
if (b) { ... }
int c = 1;
if (c) { ... }
return 0;
}
C と同様に,値が 0 であるか否かによって真偽を表現することもできます。
string 型
文字列を便利に扱うためのラッパーとして,string 型が導入されました。
string 型を利用する際は,ヘッダファイル string をインクルードする必要があります。
#include <iostream>
#include <string>
int main()
{
std::string s("abc");
std::string t("def");
std::cout << s << std::endl; // 出力: abc
std::cout << s + t << std::endl; // 出力: abcdef
std::cout << s[2] << std::endl; // 出力: c
std::cout << s.length() << std::endl; // 出力: 3
return 0;
}
string 型には,次の演算子が定義されています。
[] + == != > < >= <= = +=
従来からの文字列型 const char* と string 型との間に互換性はありません。
文字列リテラルは const char* 型であるため,"abc" + "def" のような式は無効です。
構造体の型名
C で構造体を struct Hoge { ... }; と定義したとき,この構造体の型名は struct Hoge でした。
C++ で同様の構造体を定義したとき,struct Hoge の他に,単なる Hoge がこの構造体の型名として利用できます。
const 修飾子
const 修飾された型の変数は,代入による値の変更が禁止されます。
const int n = 123;
n = 456; // 不可
C++ では const 値はコンパイル時定数として扱われるため,const 整数は配列の要素数指定に使えます。
(クラスのメンバ変数の場合は static const とすることでコンパイル時定数扱いになります。)
const int size = 32;
double arr[size];
参照
引数を参照渡しする際,C ではポインタを利用していましたが,C++ では参照 (reference) という機能が利用できます。
次のプログラムは,参照を用いて swap 関数を定義した例です。
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 2;
int b = 3;
swap(a, b);
return 0;
}
参照型の型名は,被参照型名 & と書かれます。
参照を利用するに当たって,アドレス演算子 & や間接参照演算子 * は必要ありません。
構造体等のメンバアクセスも,p->x と書く必要はなく,単に r.x と書けます。
参照の割当ては初期化時のみに行われ,参照の割当てを変更する手段はありません。
int& r = a; // r は a を参照する
int& s; // 不可 (初期化子がない)
実行時型情報
typeid 演算子は,オペランドのデータ型をプログラム実行時に判別し,その型情報 (RTTI, runtime type information) を提供します。
評価結果は const& type_info 型なので,ヘッダ typeinfo のインクルードが必要です。
#include <typeinfo>
int main()
{
std::cout << (typeid(1234) == typeid(int)) << std::endl; // 出力: 1
std::cout << (typeid(3.14) == typeid(int)) << std::endl; // 出力: 0
return 0;
}