コンテンツにスキップ

最終更新:2026-10-12

C++ struct 構造体

著者について:

個人公式アカウント(WeChat):

wechat

1.Cにおけるstruct

  • Cではstructは純粋にデータの複合型としてのみ使われます。つまり、構造体の宣言の中に置けるのはデータメンバだけで、関数を中に置くことはできません。
  • Cの構造体宣言では、public、protected、private のようなC++のアクセス指定子を使うことはできませんが、C++では使うことができます。
  • Cで構造体変数を定義するとき、下のように定義した場合はstructを付けなければなりません。
  • Cの構造体は継承できません(そのような概念がありません)。
  • 構造体の名前が関数名と同じ場合でも、正常に実行でき正常に呼び出せます!例:struct Base と衝突しない void Base() {} を定義できます。

完全な例:

#include<stdio.h>

struct Base {            // public
    int v1; 
//    public:      //error
        int v2; 
    //private:
        int v3; 
    //void print(){       // c中不能在结构体中嵌入函数
    //    printf("%s\n","hello world");
    //};    //error!
};

void Base(){
    printf("%s\n","I am Base func");
}
//struct Base base1;  //ok
//Base base2; //error
int main() {
    struct Base base;
    base.v1=1;
    //base.print();
    printf("%d\n",base.v1);
    Base();
    return 0;
}

最終的な出力:

1
I am Base func

完全なコードはこちら:struct_func.c

2.C++におけるstruct

Cとの対比は次の通りです:

  • C++の構造体ではデータだけでなく、関数も定義できます。
  • C++の構造体では public、protected、private のようなアクセス指定子を使えます。
  • C++の構造体はstructを付けずに直接使えます。
  • C++の継承
  • 構造体の名前が関数名と同じ場合でも、正常に実行でき正常に呼び出せます!ただし、構造体変数を定義するときはstruct付きしか使えません!

例えば:

場合1:typedefで構造体の別名を定義しない場合

同名の関数を追加する前:

struct Student {

};
//Student(){}
struct Student s; //ok
Student s;  //ok

同名の関数を追加した後:

struct Student {

};
Student(){}
struct Student s; //ok
Student s;  //error

場合2:typedefで構造体の別名を定義する場合

typedef struct Base1 {         
    int v1;
    int v3;
    public:     //显示声明public
    int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
}B;
//void B() {}  //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名

前の3つの例

#include<iostream>
#include<stdio.h>

struct Base {         
    int v1;
//    private:   //error!
        int v3;
    public:     //显示声明public
        int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
};

int main() {
    struct Base base1;  //ok
    Base base2; //ok
    Base base;
    base.v1=1;
    base.v3=2;
    base.print();
    printf("%d\n",base.v1);
    printf("%d\n",base.v3);
    return 0;
}

完全なコードはこちら:struct_func.cpp

継承の例

#include<iostream>
#include<stdio.h>
struct Base {         
    int v1;
//    private:   //error!
        int v3;
    public:   //显示声明public
        int v2;
    virtual void print(){       
        printf("%s\n","Base");
    };    
};
struct Derived:Base {         

    public:
        int v2;
    void print(){       
        printf("%s\n","Derived");
    };    
};
int main() {
    Base *b=new Derived();
    b->print();
    return 0;
}

完全なコードはこちら:ext_struct_func.cpp

同名関数

#include<iostream>
#include<stdio.h>

struct Base {         
    int v1;
//    private:   //error!
        int v3;
    public:     //显示声明public
        int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
};

typedef struct Base1 {         
    int v1;
//    private:   //error!
        int v3;
    public:     //显示声明public
        int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
}B;
void Base(){
    printf("%s\n","I am Base func");
}
//void B() {}  //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名
int main() {
    struct Base base;  //ok
    //Base base1;  // error!
    base.v1=1;
    base.v3=2;
    base.print();
    printf("%d\n",base.v1);
    printf("%d\n",base.v3);
    Base();
    return 0;
}
完全なコードはこちら:struct_func_func.cpp

3.まとめ

CとC++におけるStructの違い

C C++
構造体宣言の中に関数を置くことはできない 構造体宣言の中に関数を置くことができる
Cの構造体宣言ではC++のアクセス指定子を使うことはできない。 public、protected、private はC++で使うことができる。
Cで構造体変数を定義するとき、次のように定義した場合はstructを付けなければならない。 structを付けなくてよい
構造体は継承できない(そのような概念がない)。 継承できる
構造体の名前が関数名と同じ場合でも、正常に実行でき正常に呼び出せる! 構造体の名前が関数名と同じ場合、構造体を使用するときはstruct付きの定義しか使えない!

関連トピック

コメント