Saltar a contenido

Última actualización:2026-10-12

struct (estructuras) en C++

Sobre el autor:

Cuenta pública personal:

wechat

1. struct en C

  • En C, struct se usa únicamente como tipo compuesto de datos; es decir, en la declaración de la estructura solo pueden colocarse miembros de datos, no funciones.
  • En la declaración de una estructura en C no se pueden usar los modificadores de acceso de C++, como public, protected y private, mientras que en C++ sí se pueden usar.
  • Al definir una variable de estructura en C, si se usa la definición siguiente hay que añadir struct.
  • Las estructuras de C no pueden heredar (no existe ese concepto).
  • Si el nombre de una estructura coincide con el de una función, el programa se ejecuta con normalidad y la llamada se realiza correctamente! Por ejemplo: se puede definir un void Base() {} que no entra en conflicto con struct Base.

Caso completo:

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

Salida final:

1
I am Base func

El código completo puede verse en: struct_func.c

2. struct en C++

Comparado con C:

  • En una estructura de C++ no solo se pueden definir datos, sino también funciones.
  • En una estructura de C++ se pueden usar modificadores de acceso, como public, protected y private.
  • Al usar una estructura de C++ se puede prescindir directamente de struct.
  • Herencia en C++
  • Si el nombre de una estructura coincide con el de una función, el programa se ejecuta con normalidad y la llamada se realiza correctamente! Pero al definir la variable de estructura solo se puede usar la forma con struct!

Por ejemplo:

Caso 1: no usar typedef para definir un alias de la estructura

Antes de añadir la función con el mismo nombre:

struct Student {

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

Después de añadir la función con el mismo nombre:

struct Student {

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

Caso 2: usar typedef para definir un alias de la estructura

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" 的别名

Los tres casos anteriores

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

El código completo puede verse en: struct_func.cpp

Caso de herencia

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

El código completo puede verse en: ext_struct_func.cpp

Función con el mismo nombre

#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;
}
El código completo puede verse en: struct_func_func.cpp

3. Resumen

Diferencias de struct entre C y C++

C C++
No se pueden incluir funciones en la declaración de una estructura Se pueden incluir funciones en la declaración de una estructura
En la declaración de una estructura en C no se pueden usar los modificadores de acceso de C++. public, protected y private sí pueden usarse en C++.
Al definir una variable de estructura en C, si se usa la definición siguiente hay que añadir struct. Se puede omitir struct
Las estructuras no pueden heredar (no existe ese concepto). Pueden heredar
Si el nombre de una estructura coincide con el de una función, el programa se ejecuta con normalidad y la llamada es correcta! Si el nombre de una estructura coincide con el de una función, para usar la estructura solo se puede emplear la definición con struct!

Temas relacionados

Comentarios