Ir para o conteúdo

Última atualização:2026-10-12

struct em C++

Sobre o autor:

Conta oficial do WeChat:

wechat

1.struct em C

  • Em C, struct é usado puramente como um tipo composto de dados; ou seja, na declaração da estrutura só é possível colocar membros de dados, não funções.
  • Na declaração de uma estrutura em C não é possível usar modificadores de acesso do C++, como public, protected e private; já em C++ eles podem ser usados.
  • Ao definir variáveis de estrutura em C, se for usada a definição abaixo, é obrigatório acrescentar struct.
  • Estruturas em C não têm herança (o conceito não existe).
  • Se o nome da estrutura for igual ao de uma função, o programa roda normalmente e a chamada funciona! Por exemplo: é possível definir void Base() {} sem conflito com 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;
}

Saída final:

1
I am Base func

O código completo está em: struct_func.c

2.struct em C++

Comparando com C:

  • Em estruturas C++ é possível definir não apenas dados, mas também funções.
  • Em estruturas C++ podem ser usados modificadores de acesso, como public, protected e private.
  • No uso de estruturas C++, pode-se usar diretamente sem struct.
  • Herança em C++
  • Se o nome da estrutura for igual ao de uma função, o programa roda normalmente e a chamada funciona! Mas, ao definir variáveis da estrutura, só é possível usar a forma com struct!

Por exemplo:

Caso 1: sem usar typedef para definir um alias da estrutura

Antes de adicionar a função de mesmo nome:

struct Student {

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

Depois de adicionar a função de mesmo nome:

struct Student {

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

Caso 2: usando typedef para definir um alias da estrutura

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

Os três primeiros casos

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

O código completo está em: struct_func.cpp

Caso de herança

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

O código completo está em: ext_struct_func.cpp

Função de mesmo nome

#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;
}
O código completo está em: struct_func_func.cpp

3.Resumo

Diferenças entre struct em C e C++

C C++
Não é possível colocar funções na declaração da estrutura É possível colocar funções na declaração da estrutura
Na declaração de estrutura em C não é possível usar modificadores de acesso do C++. public, protected e private podem ser usados em C++.
Ao definir variáveis de estrutura em C, se for usada a definição abaixo, é obrigatório acrescentar struct. Pode-se omitir struct
Estruturas não têm herança (o conceito não existe). Herança é possível
Se o nome da estrutura for igual ao de uma função, o programa roda normalmente e a chamada funciona! Se o nome da estrutura for igual ao de uma função, para usar a estrutura só é possível usar a definição com struct!

Tópicos relacionados

Comentários