MENU

【C++】構造体(struct)とは?実例を交えて徹底解説!

こんにちは!システムエンジニア歴5年のキョンです。今回はC++の構造体について、実務での経験を交えながら分かりやすく解説していきます。

目次

構造体って何?

構造体(struct)は、複数の変数をまとめて1つのデータ型として扱える機能です。例えば、ゲーム開発で「プレイヤーの位置」を管理する時、X座標とY座標をまとめて扱えると便利ですよね。そんな時に使うのが構造体です。

構造体の基本的な書き方

struct Player {
    int x;      // X座標
    int y;      // Y座標
    string name; // プレイヤー名
    int hp;     // 体力
};

構造体の使い方

1. 構造体の宣言と初期化

// 通常の初期化
Player player1;
player1.x = 100;
player1.y = 200;
player1.name = "勇者";
player1.hp = 100;

// 一括初期化(C++11以降)
Player player2 = {100, 200, "魔法使い", 80};

2.メンバへのアクセス

// メンバ変数へのアクセス
cout << player1.name << "の座標: (" 
     << player1.x << ", " << player1.y << ")" << endl;

// メンバ変数の変更
player1.hp -= 10;  // ダメージを受けた

実践的な構造体の使い方

1. 配列とベクターでの使用

// 構造体の配列
Player party[4];

// vectorでの使用
vector<Player> players;
players.push_back({100, 200, "戦士", 120});

2.メンバ関数を持つ構造体

struct Character {
    string name;
    int hp;
    int attack;
    
    // メンバ関数
    void showStatus() {
        cout << name << "のHP: " << hp << endl;
    }
    
    void attackEnemy(Character& enemy) {
        enemy.hp -= attack;
    }
};

構造体を使うメリット

1. コードの可読性向上

関連するデータをまとめることで、コードが読みやすくなります。

// 構造体を使わない場合
int player1_x, player1_y, player1_hp;
string player1_name;

// 構造体を使う場合
Player player1;  // すっきり!

2.データの管理が楽

// プレイヤーの情報を関数に渡す
void healPlayer(Player& player) {
    player.hp += 50;
    if (player.hp > 100) player.hp = 100;
}

3. 拡張性が高い

新しい要素を追加する時も、構造体の定義を変更するだけでOK!

実務でよく使う構造体のパターン

1. データ構造の定義

struct UserData {
    int id;
    string name;
    string email;
    time_t lastLogin;
};

2.設定情報の管理

struct Config {
    string serverAddress;
    int port;
    bool useSSL;
    int timeout;
};

3.図形情報の管理

struct Rectangle {
    int x, y;      // 左上の座標
    int width;     // 幅
    int height;    // 高さ
    
    int getArea() {
        return width * height;
    }
};

つまずきやすいポイントと解決法

1. 構造体のサイズ

  • メモリアライメントの影響で、メンバ変数の合計サイズと構造体のサイズが異なることがある
  • パディングを意識した変数の配置が重要
struct BadAlignment {
    char a;    // 1バイト
    int b;     // 4バイト
    char c;    // 1バイト
};  // サイズは12バイト(パディングあり)

struct GoodAlignment {
    int b;     // 4バイト
    char a;    // 1バイト
    char c;    // 1バイト
};  // サイズは6バイト

2.コピーと参照

void updatePlayer(Player& player) {  // 参照渡し
    player.hp += 10;  // 元のデータが変更される
}

void showPlayer(const Player& player) {  // const参照
    cout << player.name << endl;  // データ変更不可
}

まとめ

構造体は、関連するデータをまとめて扱うための便利な機能です。特に:

  • データの整理整頓
  • コードの可読性向上
  • 保守性の向上 に役立ちます。

よくある質問(FAQ)

Q1. 構造体とクラスの違いは?

A1. C++では、メンバのデフォルトのアクセス権が異なります(構造体はpublic、クラスはprivate)。それ以外は基本的に同じ機能を持ちます。

Q2. 構造体のサイズはメンバ変数の合計サイズ?

A2. メモリアライメントの影響で、実際のサイズは大きくなることがあります。

Q3. 構造体をキーにしたmapは作れる?

A3. 比較演算子をオーバーロードすれば可能です。ただし、すべてのメンバを比較する必要があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次