1
resposta

Difference entre formas de instanciar objetos

Devo estar ja confuso de tanta informacao a esta altura do curso, mas, qual seria a diferenca entre os instanciamentos:

Usuario usuario = new usuario;

e

Usuario* usuario = new usuario;

ps: existe diferenca na posicao do * ? Tipo, seria "Usuario* usuario" diferente de "Usuario *usuario"?

1 resposta

Olá, estudante.

Tudo bem?

Verdade, tem hora que é muita informação, a gente acaba se confundindo e tem coisas que demoram mais para entrar na cabeça. Mas é normal. Todo mundo passa por isso em programação.

Vou tentar ajudar a entender a diferença entre as formas de instanciar objetos em C++ que você mencionou.

1. Usuario usuario = new Usuario;

Essa linha de código está incorreta em. O correto seria com U maiúsculo após o new:

Usuario* usuario = new Usuario;

Aqui, você está alocando um objeto Usuario na memória heap e armazenando o endereço desse objeto em um ponteiro usuario. Isso significa que você terá que gerenciar manualmente a memória, ou seja, lembrar de liberar essa memória com delete quando não precisar mais do objeto para evitar vazamento de memória.

2. Usuario* usuario = new Usuario;

Essa é a forma correta de alocar um objeto Usuario na heap. O ponteiro usuario armazena o endereço do objeto criado. Como mencionado anteriormente, é crucial liberar a memória alocada com delete para evitar vazamentos de memória:

delete usuario;

Diferença na posição do *

Não há diferença funcional entre Usuario* usuario e Usuario *usuario. Ambas as formas são equivalentes e funcionam da mesma maneira. A escolha entre uma e outra é puramente uma questão de estilo de código. Alguns preferem colocar o * próximo ao tipo (Usuario* usuario), enquanto outros preferem colocá-lo próximo ao nome da variável (Usuario *usuario).

Exemplo Prático

Aqui está um exemplo prático para ilustrar as diferenças:

#include <iostream>

class Usuario {
public:
    void dizOla() {
        std::cout << "Olá, eu sou um usuário!" << std::endl;
    }
};

int main() {
    // Alocação na heap
    Usuario* usuarioHeap = new Usuario;
    usuarioHeap->dizOla();
    delete usuarioHeap; // Lembre-se de liberar a memória!

    // Alocação na stack
    Usuario usuarioStack;
    usuarioStack.dizOla();

    return 0;
}

No exemplo acima, usuarioHeap é alocado na heap e precisa ser deletado manualmente, enquanto usuarioStack é alocado na stack e será automaticamente destruído quando sair do escopo.

Espero ter ajudado e bons estudos!