C++ Struct (struct)

Los arreglos C/C++ permiten definir variables que pueden almacenar elementos de datos del mismo tipo, perola estructuraes otro tipo de datos disponible definido por el usuario en C++, que le permite almacenar elementos de datos de diferentes tipos.

Las estructuras se utilizan para representar un registro. Suponga que desea hacer un seguimiento de los libros en una biblioteca; es posible que necesite realizar un seguimiento de los siguientes atributos de cada libro:

  • Title: Título
  • Author: Autor
  • Subject: Categoría
  • Book ID: ID del libro

Definición de estructura

En C++, la declaración struct se utiliza para definir una estructura.

Una estructura es un tipo de datos definido por el usuario que se utiliza para agrupar datos de diferentes tipos. Similar a la clase (class), la estructura permite definir variables miembro y funciones miembro.

Para definir una estructura, debe utilizarstructla declaración. La declaración struct define un nuevo tipo de datos que contiene múltiples miembros. El formato de la declaración struct es el siguiente:

struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; . . } object_names;

type_namees el nombre del tipo de estructura,member_type1 member_name1es una definición de variable estándar, por ejemploint i;ofloat f;u otras definiciones de variables válidas. Al final de la definición de la estructura, antes del último punto y coma, puede especificar una o más variables de estructura; esto es opcional. A continuación se declara un tipo de estructuraBooks, con variablesbook:

struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;

Ventajas de las estructuras:

  • Encapsulación simple de datos: adecuada para encapsular datos simples de varios tipos; generalmente se utiliza para el almacenamiento de datos.
  • Ligereza: en comparación conclass, la sintaxis de las estructuras es más concisa y adecuada para objetos de datos pequeños.
  • Soporte de orientación a objetos: admite constructores, funciones miembro y control de acceso, lo que permite implementar diseño orientado a objetos.

Acceso a los miembros de la estructura

Para acceder a los miembros de una estructura, utilizamosel operador de acceso a miembros (.). El operador de acceso a miembros es un punto entre el nombre de la variable de estructura y el miembro de la estructura al que queremos acceder.

El siguiente ejemplo demuestra el uso de las estructuras:

Ejemplo

#include <iostream> #include <cstring> using namespace std; // Declarar un tipo de estructura Books struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // Definir la variable Book1 del tipo de estructura Books Books Book2; // Definir la variable Book2 del tipo de estructura Books // Detalles de Book1 strcpy( Book1.title, "Tutorial de C++"); strcpy( Book1.author, "Ejemplo"); strcpy( Book1.subject, "Lenguaje de programación"); Book1.book_id = 12345; // Detalles de Book2 strcpy( Book2.title, "Tutorial de CSS"); strcpy( Book2.author, "Ejemplo"); strcpy( Book2.subject, "Tecnología front-end"); Book2.book_id = 12346; // Mostrar información de Book1 cout << "Título del primer libro:" << Book1.title <<endl; cout << "Autor del primer libro:" << Book1.author <<endl; cout << "Categoría del primer libro:" << Book1.subject <<endl; cout << "ID del primer libro:" << Book1.book_id <<endl; // Mostrar información de Book2 cout << "Título del segundo libro:" << Book2.title <<endl; cout << "Autor del segundo libro:" << Book2.author <<endl; cout << "Categoría del segundo libro:" << Book2.subject <<endl; cout << "ID del segundo libro:" << Book2.book_id <<endl; return 0; }

En el ejemplo se define el tipo de estructura Books y sus dos variables Book1 y Book2. Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

第一本书标题 : C++ 教程
第一本书作者 : Ejemplo
第一本书类目 : 编程语言
第一本书 ID : 12345
第二本书标题 : CSS 教程
第二本书作者 : Ejemplo
第二本书类目 : 前端技术
第二本书 ID : 12346

La estructura como parámetro de función

Puede pasar una estructura como parámetro de función, de manera similar a otros tipos de variables o punteros. Puede acceder a las variables de estructura de la misma manera que en el ejemplo anterior:

Ejemplo

#include <iostream> #include <cstring> using namespace std; void printBook( struct Books book ); // Declarar un tipo de estructura Books struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // Definir la variable Book1 del tipo de estructura Books Books Book2; // Definir la variable Book2 del tipo de estructura Books // Detalles de Book1 strcpy( Book1.title, "Tutorial de C++"); strcpy( Book1.author, "Ejemplo"); strcpy( Book1.subject, "Lenguaje de programación"); Book1.book_id = 12345; // Detalles de Book2 strcpy( Book2.title, "Tutorial de CSS"); strcpy( Book2.author, "Ejemplo"); strcpy( Book2.subject, "Tecnología front-end"); Book2.book_id = 12346; // Mostrar información de Book1 printBook( Book1 ); // Mostrar información de Book2 printBook( Book2 ); return 0; } void printBook( struct Books book ) { cout << "Título del libro:" << book.title <<endl; cout << "Autor del libro:" << book.author <<endl; cout << "Categoría del libro:" << book.subject <<endl; cout << "ID del libro:" << book.book_id <<endl; }

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

书标题 : C++ 教程
书作者 : Ejemplo
书类目 : 编程语言
书 ID : 12345
书标题 : CSS 教程
书作者 : Ejemplo
书类目 : 前端技术
书 ID : 12346

Explicación detallada de cada parte de la estructura

  • La palabra clave struct:Se utiliza para definir una estructura; le dice al compilador que lo que sigue es un tipo personalizado.

  • Variables miembro:Las variables miembro son los elementos de datos definidos en la estructura; pueden ser de cualquier tipo básico u otro tipo personalizado. En struct, estos miembros son públicos (public) por defecto y se puede acceder a ellos directamente.

  • Funciones miembro:Las estructuras también pueden contener funciones miembro, lo que las hace similares a las clases en funcionalidad. Las funciones miembro pueden operar sobre las variables miembro de la estructura, proporcionando encapsulación y manipulación de datos.

  • Control de acceso:Similar a class, puede usar public, private y protected en struct para definir los permisos de acceso de los miembros. En struct, todos los miembros son públicos (public) por defecto, mientras que en class son privados (private) por defecto.

Puntero a estructuras

Puede definir un puntero a una estructura de manera similar a como se define un puntero a otros tipos de variables, como se muestra a continuación:

struct Books *struct_pointer;

El código anterior define un puntero struct_pointer al tipo de estructura Books.

Ahora puede almacenar la dirección de una variable de estructura en el puntero definido anteriormente. Para obtener la dirección de una variable de estructura, coloque el&operador delante del nombre de la estructura, como se muestra a continuación:

struct_pointer = &Book1;

El código anterior asigna la dirección de la variable de estructura Book1 a struct_pointer.

Para acceder a los miembros de la estructura mediante un puntero a la estructura, debe usar el->operador, como se muestra a continuación:

struct_pointer->title;

El código anterior accede al miembro title de la estructura Book1 a través de struct_pointer.

Reescribamos el ejemplo anterior usando punteros a estructuras; esto le ayudará a comprender el concepto de punteros a estructuras:

Ejemplo

#include <iostream> #include <string> using namespace std; // Declarar un tipo de estructura Books struct Books { string title; string author; string subject; int book_id; // Constructor Books(string t, string a, string s, int id) : title(t), author(a), subject(s), book_id(id) {} }; // Función que imprime la información del libro; acepta un puntero al tipo de estructura Books void printBookInfo(const Books* book) { cout << "Título del libro:" << book->title << endl; cout << "Autor del libro:" << book->author << endl; cout << "Categoría del libro:" << book->subject << endl; cout << "ID del libro:" << book->book_id << endl; } int main() { // Crear objetos de dos libros Books Book1("Tutorial de C++", "Ejemplo", "Lenguaje de programación", 12345); Books Book2("Tutorial de CSS", "Ejemplo", "Tecnología front-end", 12346); // Usar punteros para apuntar a los objetos de los dos libros Books* ptrBook1 = &Book1; Books* ptrBook2 = &Book2; // Mostrar información de los libros, pasando punteros printBookInfo(ptrBook1); printBookInfo(ptrBook2); return 0; }

Explicación:

  • Definición de la estructura:BooksLa definición de la estructura es la misma que antes; contienetitle、author、subjectybook_idcuatro variables miembro y un constructor para inicializarlas.

  • printBookInfoLa función: ahora esta función acepta un puntero aBooksun puntero a la estructuraconst Books* book. Dentro de la función, usamos->el operador para acceder a las variables miembro a las que apunta el puntero de estructura.

  • mainLa función:

    • crea dosBooksobjetos de tipoBook1yBook2。

    • usando&el operador para obtener las direcciones de estos dos objetos y asignarlas a los punterosptrBook1yptrBook2。

    • al llamarprintBookInfoa la función, se pasan punteros aBookslos objetos.

Cuando el código anterior se compila y ejecuta, produce los siguientes resultados:

书籍标题: C++ 教程
书籍作者: Ejemplo
书籍类目: 编程语言
书籍 ID: 12345
书籍标题: CSS 教程
书籍作者: Ejemplo
书籍类目: 前端技术
书籍 ID: 12346

La palabra clave typedef

A continuación se muestra una forma más sencilla de definir estructuras: puede asignar un 'alias' al tipo creado. Por ejemplo:

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

Ahora puede usar directamenteBookspara definir variables de tipoBookssin necesidad de usar la palabra clave struct. A continuación se muestra un ejemplo:

Books Book1, Book2;

Puede usar latypedefpalabra clave para definir tipos que no son estructuras, como se muestra a continuación:

typedef long int *pint32;
 
pint32 x, y, z;

x, y y z son punteros a long int (entero largo).


Diferencias entre struct y clase

En C++, struct y class son esencialmente muy similares; la única diferencia radica en la visibilidad predeterminada:

  • structEl acceso predeterminado de los miembros y la herencia espublic。
  • classEl acceso predeterminado de los miembros y la herencia esprivate。

Puedes tratarstructcomo una forma simplificada declass, adecuada para el encapsulamiento simple de datos sin demasiadas funciones complejas.

Combinación de estructuras y funciones

Puedes inicializar una estructura mediante un constructor y también pasarla por referencia para evitar copias innecesarias.

Ejemplo

struct Books {
    string title;
    string author;
    string subject;
    int book_id;

    // constructor
    Books(string t, string a, string s, int id)
        : title(t), author(a), subject(s), book_id(id) {}

    void printInfo() const {
        cout << "Título del libro: " << title << endl;
        cout << "Autor del libro: " << author << endl;
        cout << "Categoría del libro: " << subject << endl;
        cout << "ID del libro: " << book_id << endl;
    }
};

void printBookByRef(const Books& book) {
    book.printInfo();
}
Otras extensiones