Перейти к содержанию

Последнее обновление:2026-10-12

C++ структуры struct

Об авторе:

Личный официальный аккаунт:

wechat

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;
}

Итоговый вывод:

1
I am Base func

Полный код см. в: struct_func.c

2.struct в C++

Сравнение с 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" 的别名

Первые три случая

#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.Резюме

Различия Struct в C и C++

C C++
Нельзя помещать функции в объявление структуры Можно помещать функции в объявление структуры
В объявлении структуры C нельзя использовать модификаторы доступа C++. public, protected, private можно использовать в C++.
При определении переменной структуры в C, если используется приведённое ниже определение, обязательно добавлять struct. Можно не добавлять struct
Структуры не поддерживают наследование (такого понятия нет). Наследование возможно
Если имя структуры совпадает с именем функции, программа работает нормально и функция нормально вызывается! Если имя структуры совпадает с именем функции, при использовании структуры допустимо только определение со struct!

Похожие темы

Комментарии