Ir ao conteúdo
  • Cadastre-se

C++ Array de Struct - C++


cfg_Allos
Ir à solução Resolvido por Felipe Electronic,

Posts recomendados

Pessoal, comecei a estudar C++ e apesar de saber bastante coisa de C vi algumas que me deixaram em duvida. Lá no C quando eu criava um array de "struct" a declaração ficava assim:

typedef aluno{
	int matricula;
	char nome[50];
  	float nota;
}Aluno;

Aluno alunos[10];

Já no C++ vi que eu posso fazer desse mesmo jeito, porém vi de outras formas, como essas:

typedef aluno{
	int matricula;
	std::string nome;
  	float nota;
}Aluno;

Aluno alunos[10];
//ou
Aluno alunos = new Aluno[10];
//ou
Aluno *alunos = new Aluno[3];
Aluno a1, a2, a2;
alunos[0] = a1;
alunos[1] = a2;
alunos[2] = a3;

Meu questionamento é, qual delas é a "correta" e quais as diferenças entre elas?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá, 

 

na pratica não há diferenças, pode talvez gerar alguma diferença de performasse ao utilizar o numerador *, já que sua função principal é de multiplicação matemática, podendo talvez criar uma ambiguidade desnecessária.

 

Para mim isso é uma novidade, fui pesquisar a respeito e encontrei essa orientação do site da Microsoft.

 

Citação

O operador * também é usado para declarar tipos de ponteiro e para desreferenciar ponteiros.Esse operador pode ser usado somente em contextos não seguros, indicado pelo uso da palavra-chave unsafe e exigindo a opção do compilador /unsafe. O operador de desreferenciamento é também conhecido como operador de indireção.

Tipos definidos pelo usuário podem sobrecarregar o operador binário * (consulte operador).Quando um operador binário está sobrecarregado, o operador de atribuição correspondente, se houver, também estará implicitamente sobrecarregado.

 

FONTE: https://docs.microsoft.com/pt-br/dotnet/csharp/language-reference/operators/multiplication-operator

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Solução

O Colega acima ja respondeu. Ambas as formas são válidas do ponto de vista de OBEDECER A SINTAXE da linguagem, do ponto de vista de desenvolvimento vai depender muito mais da aplicação de das restrições de alocação de memória que você tiver, por exemplo ao usar o operador new, a memoria alocada vem de uma região chamada heap, e mesmo que você aloque memoria dentro de uma função, com o new, sem dar delete depois do uso aquela memoria ficará alocada e sem condições de ser reutilizada, sendo de um modo geral pouco recomendado o seu uso (existem momentos certos para o uso de alocação dinamica com o new/delete mas foge ao escopo do topico).

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Na realidade estruturas em C++ não são bem as mesmas que em c, mais bem são classes. Veja esse exemplo:
 

#include <iostream>
using namespace std;

struct Pessoa{
    Pessoa( int umaIdade, string umNome )
    : suaIdade(umaIdade), seuNome(umNome)
    {}
    int suaIdade;
    string seuNome;
    void setNome(string umNome){
        seuNome = umNome;
    }
    
    void setIdade(int umaIdade){
        suaIdade = umaIdade;
    }
private:
    
};



int main (){
    int idade = 28;
    string nome = "Daniel";
    
    Pessoa daniel(idade, nome);
    
    cout << daniel.seuNome << endl;
    
    cin.ignore();
    return 0;
}

você pode ter construtores, funções, etc, Praticamente os mesmos mecanismos que as classes. Para você fazer uma ideia nem precisa usar o typedef, que também funciona, mas acredito que seja por compatibilidade.

adicionado 4 minutos depois

a diferença entre classes e structs em C++ é que, por default em structs você tem os membros de forma publica, e em classes você tem por default os membros de forma privada, e basicamente é só isso a diferença entre ambos. Em C não podemos ter funções construtores etc.

adicionado 8 minutos depois

Ah! E mais uma coisa... Se usar new não se esqueça de usar delete para liberar.

 

Por certo... Isso da erro!!

#include <iostream>
using namespace std;

typedef struct aluno{
	int matricula;
	std::string nome;
  	float nota;
}Aluno;



int main (){
    Aluno alunos = new Aluno[10];
    
    cin.ignore();
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!