最終更新:2026-10-12
C++ struct 構造体¶
著者について:¶
個人公式アカウント(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;
}
最終的な出力:
完全なコードはこちら:struct_func.c
2.C++におけるstruct¶
Cとの対比は次の通りです:
- C++の構造体ではデータだけでなく、関数も定義できます。
- C++の構造体では public、protected、private のようなアクセス指定子を使えます。
- C++の構造体はstructを付けずに直接使えます。
- C++の継承
- 構造体の名前が関数名と同じ場合でも、正常に実行でき正常に呼び出せます!ただし、構造体変数を定義するときはstruct付きしか使えません!
例えば:
場合1:typedefで構造体の別名を定義しない場合
同名の関数を追加する前:
同名の関数を追加した後:
場合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;
}
3.まとめ¶
CとC++におけるStructの違い¶
| C | C++ |
|---|---|
| 構造体宣言の中に関数を置くことはできない | 構造体宣言の中に関数を置くことができる |
| Cの構造体宣言ではC++のアクセス指定子を使うことはできない。 | public、protected、private はC++で使うことができる。 |
| Cで構造体変数を定義するとき、次のように定義した場合はstructを付けなければならない。 | structを付けなくてよい |
| 構造体は継承できない(そのような概念がない)。 | 継承できる |
| 構造体の名前が関数名と同じ場合でも、正常に実行でき正常に呼び出せる! | 構造体の名前が関数名と同じ場合、構造体を使用するときはstruct付きの定義しか使えない! |
関連トピック¶
- C++ 純粋仮想関数と抽象クラス | C++那些事
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 間接参照演算子 * | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事