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 ++

Pilha, estática e heap em c ++

O que e onde estão a pilha e a pilha?

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top