Последнее обновление:2026-10-12
C++ структуры struct¶
Об авторе:¶
Личный официальный аккаунт:

1.struct в C¶
- В C struct используется исключительно как составной тип данных, то есть в объявлении структуры можно размещать только члены данных, но не функции.
- В объявлении структуры C нельзя использовать модификаторы доступа C++, такие как public, protected и private, тогда как в C++ это допустимо.
- При определении переменной структуры в C, если используется приведённое ниже определение, обязательно добавляйте struct.
- Структуры в C не поддерживают наследование (такого понятия там нет).
- Если имя структуры совпадает с именем функции, программа работает нормально и функция нормально вызывается! Например: можно определить void Base() {}, не конфликтующую с struct 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.struct в C++¶
Сравнение с 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" 的别名
Первые три случая
#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.Резюме¶
Различия Struct в C и C++¶
| 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++那些事