tipo diferente de instanciação em C ++
-
18-09-2019 - |
Pergunta
Desde que eu vim de C# para C ++, tudo parece louco para mim no C ++. Só estou me perguntando se alguém poderia me explicar por que temos esse tipo de instanciação em C ++: Método 1:
ClassA obj1; // this is going to stack
Método 2:
ClassA *obj1 = new ClassA(); //this is going to heap
Considerando que não temos a instanciação comum de C# no C ++:
ClassA obj2 = new obj2();
E mais uma pergunta no Method1, recebo uma instância da Classa, mas sem () e este é o lugar exato em que fiquei confuso, por que precisamos instituir assim? Nossa classe tem um construtor, mas instanciando sem parênteses ??? Como é que chamamos seu construtor?
PS: Eu li estes tópicos:
Métodos diferentes para instantar um objeto em C ++
Solução
De fato, se movendo para C ++ de um idioma como Java ou C# pode ser assustador, eu também passei por ele.
A primeira e principal diferença é que, no C ++, você quase sempre gerencia sua própria memória. Ao criar um objeto na pilha, você é responsável por excluí -lo para que não vaze memória - por sua vez, isso significa que você pode excluí -lo quando achar o ajuste. Ao criar um objeto na pilha, ele é excluído automaticamente quando ele fica fora de escopo - você deve ter cuidado para não usá -lo depois de sair do escopo.
Exemplo:
void do_queue(B& queue)
{
Evt *e = new Evt;
queue.queueEvent(e);
} // all well, e can be popped and used (also must be deleted by someone else!)
contra
void do_queue(B& queue)
{
Evt e;
queue.queueEvent(&e);
} // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg
Dito isto, os dois métodos também são significativamente diferentes em um aspecto: o primeiro cria um objeto. O segundo cria um ponteiro para um objeto. O bom de ter ponteiros é que você pode transmiti -los como parâmetros com apenas memória mínima sendo copiada na pilha (o ponteiro é copiado, em vez de todo o objeto). Obviamente, você sempre pode obter o endereço de um objeto alocado na pilha usando "&" ou passá -lo como uma referência - no entanto, ao usar objetos alocados na pilha, você tem muito cuidado com o escopo deles.
Achei este site um ótimo recurso quando mudei de Java para C ++: http://www.parashift.com/c++-faq-lite/ - Você provavelmente encontrará isso também, oferece muitas boas explicações
Outras dicas
Em C ++, você deve decidir onde deseja que seu objeto resida. Por onde quero dizer em que memória, a pilha ou a pilha.
Instantar um objeto é um processo de duas etapas. Primeiro, você precisa de memória e a leva na pilha ou a aloca da pilha. Segundo, você inicializa a memória com os valores desejados, ou seja, você constrói o objeto, chamando sua função construtora.
Essas duas sintaxes são para esses dois possíveis locais de memória diferentes: a pilha e a pilha.
Em relação à sintaxe e aos parênteses aparentemente ausentes para a pilha alocada, é desambiguar entre a definição e a construção de um objeto e a declaração de uma função. De fato, ClassA obj();
Declara uma função que não está tomando parâmetro e retornando um objeto de classe.
A sintaxe C ++ é assim. Se você deseja usar o construtor padrão, basta chamá -lo assim:
ClassA obj1;
Se você tivesse um construtor com um parâmetro, chamaria assim:
ClassA obj1(5);