Mandar um cafézinho para o programador:


Me ajude a transformar café em código!

Função Construtor em C++- Orientação a Objetos

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


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.


2 comentários:

  1. MyClass C;

    ou

    MyClass* ptrClass;
    ptrClass = new MyClass;

    qual dos dois usar e quando? qual a diferença?

    ResponderExcluir
  2. Alguém me consegue ajudar no exercicio?
    Escreva 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.

    ResponderExcluir

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo