paulo1205
(usa Ubuntu)
Enviado em 06/03/2014 - 21:08h
Objetos instanciados são como qualquer outra variável dos tipos nativos, então permita-me falar deles como variáveis na discussão abaixo.
Variáveis em C e em C++ têm dois tipos de escopo -- local ou global -- e dois tipos de forma de armazenamento -- automático ou estático.
Escopo global significa que a variável está visível em qualquer parte do programa. Para que isso aconteça, a variável tem de ser declarada no nível mais externo do programa, fora de qualquer definição de função (mesmo
main()) ou estrutura. O escopo é dito local quando a variável é declarada dentro de um bloco (seja a definição de uma função, seja o corpo de um
if/
else ou de um laço de repetição), o que implica que a variável somente será visível dentro daquele bloco, nunca por partes do programa exteriores.
A forma de armazenamento estática significa que o espaço necessário para guardar a variável é fixo e providenciado pelo compilador no momento da compilação. Variáveis globais são sempre estáticas. As locais somente são estáticas se precedidas pela palavra chave
static no momento da declaração. Se esse não for o caso, a variável tem armazenamento automático, o que significa que o espaço para armazenar a variável é automaticamente providenciado no momento em que o fluxo de execução do programa passa pelo ponto em que a variável foi declarada e automaticamente liberado ao final do bloco em que a variável está contida.
----
Outra característica fundamental de C e de C++ diz respeito a funções: todos os argumentos de uma função são sempre passados a ela
por valor (i.e. a função chamada recebe
cópias dos valores informados por quem a chamou). Assim sendo, todas as eventuais alterações que uma função faça sobre os valores recebidos não se refletem sobre os originais.
----
Ponteiros são a ferramenta para que se consiga atravessar as barreiras de escopo e de tempo de vida impostas pelos limites de blocos e pela passagem de argumentos de funções por valor. Se eu obtenho o endereço de uma variável e o passo como argumento a uma função, a cópia desse endereço que é recebida pela função pode ser usada para chegar ao mesmo dado, permitindo que a função o manipule diretamente.
Inversamente, se eu uso uma chamada ao sistema operacional para reservar um bloco de memória compatível com um tipo de dados
X e preencho essa região com dados condizentes com uma variável do tipo
X, eu poderia devolver um ponteiro para essa região de memória para fora da minha função, com um efeito equivalente a criar novas variáveis do tipo
X em tempo de execução. O compilador e o ambiente de execução do C e do C++ não farão a liberação automática dessas variáveis dinamicamente alocadas nem lhes atribui nomes. Cabe ao programador guardar os endereços recebidos enquanto eles forem necessários, pois só por meio desses endereços é que se consegue chegar a cada um dos objetos alocados. Cabe-lhe também e fazer a liberação manual da memória associada aos objetos que não forem mais necessários.