P.O.O C++ Classes e Ponteiros [RESOLVIDO]

1. P.O.O C++ Classes e Ponteiros [RESOLVIDO]

Christopher
incognito

(usa Slackware)

Enviado em 23/06/2013 - 23:20h

Olá pessoal do VOL, eu ainda sou muito jovem no mundo da programação e não consegui absorver alguns conceitos básicos ainda.

Eu não estou conseguindo entender a diferença entre um objeto e um ponteiro para uma classe. Para tentar me ajudar a entender melhor eu procurei fazer alguns testes que falharam. Eu criei um Aluno.h com o seguinte código:

#ifndef Aluno_h
#define Aluno_h

class Aluno
{
int idade;
};

#endif

E um Aluno.cpp

#include<iostream>
using namespace std;

int main()
{
Aluno* a;
a -> idade = 30;
cout << "idade: " << a -> idade << endl;
return 0;
}

para compilar: g++ -c Aluno.cpp
g++ -o Aluno Aluno.o
./Aluno

mas o seguinte erro é gerado: Falha de segmentação. Sem o uso do ponteiro funciona normalmente, pelo que eu entendi ambos possuem a mesma funcionalidade, mas definitivamente não são a mesma coisa.

Alguém pode fornecer alguma explicação sobre ponteiros para classes e sobre o erro gerado? Obrigado!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 24/06/2013 - 16:01h

Não têm a mesma funcionalidade, não.

Um ponteiro é uma variável que armazena um endereço de memória. Esse endereço pode ser usado para apontar (por isso o nome ponteiro) para um objeto, se o endereço que essa variável armazena for o endereço onde está armazenado um objeto válido.

Ter uma variável de tipo ponteiro no programa não implica que vai haver um objeto válido para o qual qessa variável vai apontar. Aliás, ter ponteiros que apontem para endereços não-válidos é útil em muitos casos, principalmente quando esse endereço é nulo (NULL em C, NULL ou 0 em C++ até a versão 2003, e nullptr no C++ 2011), que geralmente indica que ainda não existe ou que não foi possível criar um objeto válido para ser passado ou devolvido pela função.

Esses "ainda não existe" e "não foi possível criar" referem-se a situações que podem acontecer durante a execução do programa, sem depender exclusivamente da vontade ou da análise do programador.

Um outro caso em que se usam ponteiros é para permitir que objetos possam ser manipulados em partes do programa distintas daquelas onde eles foram declarados, sem ter de ficar copiando valores de um lado para o outro. Isto é: em lugar de passar o valor do objeto para a função e receber um outro valor de volta, que poderia sobrescrever o valor original do objeto, passa-se apenas o endereço do objeto, e a função pode usar esse endereço para chegar ao objeto original, para lê-lo ou modificá-lo, conforme a necessidade. Passar endereços é vantajoso principalmente quando os objetos manipulados são muito grandes ou complexos, tornando operações de cópia mais dispendiosas do que a manipulação indireta (i.e. através do ponteiro) dos dados.

Em C++, a necessidade de usar ponteiros para este último caso é menor do que a do C, já que C++ possui "referências". Por trás das cortinas, referências funcionam de modo parecido com ponteiros, mas o usuário não tem de manipular endereços explicitamente, e tem garantia de que o objeto referido será sempre válido. Mas ainda há bastante espaço em C++ para ponteiros, principalmente para lidar com os tais objetos que possam estar numa situação de "ainda não existe" ou de "não foi possível criar".

3. Re: P.O.O C++ Classes e Ponteiros [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 24/06/2013 - 08:19h

Por ser um ponteiro, você apenas declarou uma referência na memória, o qual não tem nada instânciado nesta referência.

faltou construir:



int main()
{
Aluno* a;

a = new Aluno();

a -> idade = 30;
cout << "idade: " << a -> idade << endl;
return 0;
}




4. Re: P.O.O C++ Classes e Ponteiros [RESOLVIDO]

Christopher
incognito

(usa Slackware)

Enviado em 30/06/2013 - 15:45h

Primeiramente, desculpe pela demora para responder e segundo muito obrigado pelas respostas!

Poxa paulo1205, a sua resposta é bastante esclarecedora. Eu confesso que li o texto 3 vezes para garantir que realmente estava entendo, mas me tirou muitas dúvidas.

Apenas mais um favor, eu gostaria da recomendação de um bom livro de C++, de preferência um que tivesse exercícios.

Quando eu digo recomendação eu me refiro ao nome do livro e autor, não a um link para o livro ok?

Muito obrigado!




5. Re: P.O.O C++ Classes e Ponteiros [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/07/2013 - 03:55h

Eu gosto do "The C++ Programming Language", do próprio criador da linguagem, Bjarne Stroustrup (eu tenho a terceira edição, que se refere ao padrão da linguagem de 1998, mas pretendo comprar a quarta, com o "novo" padrão de 2011). Acho-o bastante didático e fácil de ler. No entanto, como o próprio autor diz no livro, não é um livro para quem está começando, pois supõe conhecimento relativamente avançado de programação e da linguagem C.

Não sei se é o seu caso ou não, mas se você for iniciante, o próprio Stroustrup recomenda outro livro de sua autoria, em que ensina a programar usando C++ como linguagem de trabalho. O título do livro é "Programming -- Principles and Practice Using C++", mas eu não o conheço. Pelo que eu entendi, o livro é resultado do trabalho do autor em sala de aula, e é também usado para ensinar seus alunos de graduação. Existe uma apresentação do livro no site autor, em http://www.stroustrup.com/programming.html.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts