C++ 基礎からマスターまで — 第5回
変数にはどのようなデータ型がありますか?
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
変数のデータ型について学びましょう。 大きく4つに分けることができる。
基本データ型。 メモリに直接マッピングされる最も基本的なタイプです。
1-A.特別目的
void: サイズがありません。メモリを直接占有せず、不完全なタイプだ。
std::nullptr_t : ヌルポインタリテラル nullptr の型である。
void DoSomething() {} //戻り値のない関数
void* ptr = nullptr; //タイプが決まっていないポインタ
std::nullptr_t null_val = nullptr;
1-B。算術タイプ
1-B-1。整数型 char、signed char、unsigned char:文字を格納します。 Unicodeのためのwchar_tなどもあります。 short、int、long、long long:符号付き整数を格納します。 unsigned short, unsigned int, unsigned long, unsigned long long : 符号なし整数を格納する。負数を保存しないため、signedに比べて正の保存空間が倍増します。 bool:真または偽を保存します。 1ビットではなく1バイトを使用してください。
char c = 'A';
int count = -10;
unsigned int u_count = 20;
bool is_valid = true;
1-B-2 浮動小数点型
IEEE 754に準拠したタイプで、 float、double、long double が基本的にあり、 std::float16t、std::float32t、std::float64t、std::float128t、std::bfloat16_t もあります。 (C++23 拡張)
float f_val = 3.14f;
double d_val = 3.1415926535;
2。複合データ型 基本型や他の複合型を組み合わせてメモリ上の構造を定義する型である。
ポインタ(Pointer、T ):他のタイプTのメモリアドレスを指します。 メンバポインタ (Pointer-to-member, T::) : クラス内部の特定のメンバ変数や関数のメモリオフセットを指す特殊なポインタです。
参照(Reference): Lvalue参照(T&):メモリに名前と実体があるオブジェクト(Lvalue)のエイリアスです。 Rvalue リファレンス (T&&, C++11) : 一時オブジェクトにバインドされ、移動セマンティック(Move Semantics)と完全な配信(Perfect Forwarding)のコアタイプです。
配列(Array、T [N] / T []):同じタイプのデータを連続したメモリブロックに割り当てます。 ファンクション:戻り型とパラメータリストで構成されるシグネチャ自体も単一の一意の型です。 (例:int(double、char))
列挙型(Enumeration): enum : 範囲が指定されていないデフォルトの列挙型です(暗黙的な整数変換を許可).
enum class (C++11) : 範囲が指定された厳密な列挙型である (強いタイプチェックとスコープ保証)。 ユーザー定義タイプ(Class / Struct / Union):メモリパディング(Padding)と整列(Alignment)ルールを制御してオブジェクト指向とデータ構造を実装するタイプです。
int value = 10;
int* ptr = &value; //ポインタ
int& ref = value; //Lvalue リファレンス
int&& r_ref = 20; //Rvalue リファレンス
struct MyStruct { int x; };
int MyStruct::* member_ptr = &MyStruct::x; //メンバーポインタ
int arr[5] = {1, 2, 3, 4, 5}; //配列
int(*func_ptr)(int, int); //関数ポインタ
enum class Color { Red, Green, Blue }; //厳格な列挙型
3。システムアーキテクチャ特化エイリアス これは、コンパイラとOSアーキテクチャ(32ビット/ 64ビット)によってサイズが動的に決定されるコアエイリアスタイプです。 (<cstddef>ヘッダ)
std::sizet : sizeof 演算子の戻り型です。該当システムで生成できる最大のオブジェクトのバイトサイズを表現できる符号なし整数です。 (コンテナ索引付けとメモリ割り当ての標準単位) std::ptrdifft : 2 つのポインタを引いたときの距離を示す符号付き整数です。メモリアドレス間の差を計算するために使用されます。
#include <cstddef>
int arr[10];
std::size_t arr_size = sizeof(arr); //システムアーキテクチャによる最大サイズ保証
std::ptrdiff_t diff = &arr[5] - &arr[0]; //ポインタ間の距離の計算 (5)
4。 CV-修飾子 (CV-Qualifiers) C++の型システムでは、上記のすべてのデータ型に修飾子がつくと、コンパイラの観点から全く異なる型として扱われ、オーバーロードされる。 (例:intとconst intは異なる型です)
const:対応するメモリ領域の書き込み(Write)を防止して不変性を保証する。 volatile : コンパイラのメモリ読み書き最適化を強制的に防止する。ハードウェアレジスタの制御やMMIO(Memory-Mapped I / O)通信では、レジスタの値が外部によって変更される可能性があることをコンパイラに知らせるときに不可欠です。
const int MAX_VALUE = 100; //読み取り専用、修正不可
//MAX_VALUE = 200; //コンパイルエラーが発生しました
volatile int hardware_register; //コンパイラ最適化の防止
//外部ハードウェアが値を変更できるため、毎回キャッシュではなくメモリから直接読み取られます