Neste tutorial, vamos aprender sobre um tipo especial de função, a função Construtora, que desempenha um papel muito importante na orientação a objetos.
A função Construtora do C++
Existe uma função muitíssimo importante e utilizada em orientação a objetos, é a função construtora.
E ela possui algumas características únicas e especiais.
A primeira delas é que seu nome é o mesmo nome da classe. Ou seja, se sua classe se chama "MyClass", a função construtora tem que se chamar "MyClass()", obrigatoriamente, ok?
Outra característica dela é que, assim que instanciamos um objeto, a função construtora é sempre automaticamente invocada!
Por fim, uma última característica, ela não retorna nenhum valor! Não escreva void, int, doublet etc, nada em seu cabeçalho e implementação.
Vamos ver um teste de uma função construtora funcionando? Vamos criar a classe "MyClass" que tem apenas um membro, a função "MyClass()", que simplesmente vai exibir uma mensagem, ela fica assim:
#include <iostream> using namespace std; class MyClass { public: MyClass(); }; MyClass::MyClass() { cout << "Curso C++ Progressivo"<<endl; } int main() { MyClass c; return 0; }
Prontinho! Apenas criamos o objeto 'c' e veja o que apareceu na tela:
Função Construtora: Para que serve?
Ok, já vimos como fazer, como funciona e o resultado...mas pra que serve isso? Só pra mostrar umas mensagens bobinhas na tela?
Claro que não, jovem!
Como o próprio nome diz, ele serve para 'construir' coisas, no caso, ele constrói coisas automaticamente. Quando criamos um objeto, é interessante que ele já faça algumas operações internas de imediato, sem precisarmos sempre fazer tudo manualmente.
A este tipo de construtor, chamamos ele de default, pois ele não recebe nenhum argumento. Porém, a maneira mais comum e útil de usar uma função construtora é com uma lista de parâmetros, que são informações que vem de fora pra dentro do objeto, e vão desempenhar algum papel importante lá dentro.
Função Construtora: Como usar?
Por exemplo, vamos relembrar nossa classe Rect, que criava retângulos. Lembra que sempre tínhamos que usar as funções setters para definir os valores de comprimento e largura. Que tal se o construtor fizesse isso automaticamente?
Veja como fica:
#include <iostream> using namespace std; class Rect { private: double length, width; public: Rect(double, double); double getArea(); double getPerimeter(); }; Rect::Rect(double l, double w) { length = l; width = w; } double Rect::getArea() { return length * width; } double Rect::getPerimeter() { return 2*(length+width); } int main() { double len, wid; cout<<"Comprimento: "; cin >> len; cout<<"Largura: "; cin >> wid; Rect r(len, wid); cout<<"Area: " << r.getArea() << endl; cout<<"Perimetro: " << r.getPerimeter() << endl; return 0; }
Note que no cabeçalho do construtor, já especificamos que ele vai receber duas variáveis do tipo double.
Na implementação, chamamos essas variáveis de 'l' e 'w', que serão fornecidas mais adiante pelo usuário.. E o que nosso construtor faz? Vai setar os valores corretos de 'length' e 'width'.
Na main, pedimos os valores de comprimento e largura, e depois simplesmente instanciamos um objeto do tipo Rect, de nome 'r'. Note agora que nele enviamos dois argumentos, que são os dois argumentos que a função construtora vai usar!
Pronto, internamente, dentro do objeto, o construtor já fez tudo e as funções getArea() e getPerimeter() já podem ser usadas.
Um pouco mais sobre Função Construtora
Uma outra curiosidade sobre construtores é que eles SEMPRE existem! Mesmo que você não defina nenhum, o C++ vai lá e cria um, vazio, que não faz nada.
Quando você faz:
- MyClass c;
Ele automaticamente vai invocar o construtor, mas você não vê nada ocorrendo, pois não definiu nenhum construtor.
Outro truque que você pode precisar e usar, é através de ponteiros, declarando um ponteiro de um objeto:
- MyClass *ptrClass;
Ao fazer isso, o método construtor não será executado, pois não foi criado um objeto, apenas um ponteiro para um objeto.
Agora se fizer isso em seguida:
- ptrClass = new MyClass;
Aí sim, o objeto foi instanciado e alocado na memória, e o construtor será sumariamente executado.
MyClass C;
ResponderExcluirou
MyClass* ptrClass;
ptrClass = new MyClass;
qual dos dois usar e quando? qual a diferença?
Alguém me consegue ajudar no exercicio?
ResponderExcluirEscreva em C++ uma classe "Continente"
Um continente possui um nome e é composto por um conjunto de características (atributos).
Forneça aos membros da classe o seguinte:
Um construtor que inicialize o nome de cada continente;
Um método que retorne a dimensão total do continente;
Um método que retorne a população total do continente;
Um método que retorne o continente com maior população;
Um método que retorne o continente com menor população;
Vocês podem inserir dados aleatoriamente.
No fim, na main, caso consigas, cria a possibilidade do utilizador escolher um continente e o programa apresenta todos os dados desse continente.
Caso contrário imprima apenas os dados
Desafio opcional: Cria uma outra classe nomeada de Pais, onde possas instanciar pelos menos dois países associados a um continente e que na apresentação dos dados, mostre quais os países la dentro.