Como criar um objeto em C++? 3 tipos de Construtores com exemplos

Como criar um objeto em C++

Para se criar um objeto em C++ é preciso utilizar os construtores. Os construtores em C++ são métodos (ou funções membro de uma classe) especiais que possuem o mesmo nome que a classe e servem para criar objetos da classe à qual pertencem.

Os principais tipos de construtores são o construtor padrão, o construtor por cópia e o construtor por parâmetros (há ainda os construtores por deslocamentomove constructors, em inglês-, mas eles são um tópico mais avançado do qual falarei em um artigo futuro). Tratarei desses três principais tipos de construtores em C++ tomando por exemplo a classe Filme mostrada a seguir.


Exemplo 1 – Uso dos principais tipos de construtores em C++

/******************************************
* Exemplo #1 - Como criar um objeto em C++
* Uso dos construtores
*******************************************/

#include <iostream>
#include <string>

using namespace std;

class Filme {
public:
    // Construtor padrão
    Filme() = default;
    // Construtor por cópia
    Filme(const Filme& iFilme) = default;
    // Construtor por parâmetros
    Filme(const string& iTitulo, const string& iDiretor,
          const unsigned int iAnoDeLancamento) : titulo(iTitulo),
            diretor(iDiretor), anoDeLancamento(iAnoDeLancamento) {}
    ~Filme() = default;
    
    // Os atributos são públicos para simplificar o exemplo
    // mas normalmente eles deveriam ser privados
    string titulo = "sem titulo";
    string diretor = "ninguem";
    unsigned int anoDeLancamento = 9999;
};

int main() {
    Filme desconhecido;
    Filme rocky{"Rocky", "John G. Avildsen", 1976};
    
    cout << "O filme é " << rocky.titulo << ", do diretor " 
         << rocky.diretor << ", lançado em "
         << rocky.anoDeLancamento << "." << endl;
    
    cout << "O filme é " << desconhecido.titulo << ", do diretor " 
         << desconhecido.diretor << ", lançado em " 
         << desconhecido.anoDeLancamento << "." << endl;

    return 0;
}

Saída:

O filme é Rocky, do diretor John G. Avildsen, lançado em 1976.
O filme é sem titulo, do diretor ninguem, lançado em 9999.


Criar objeto em C++ usando o Construtor padrão

Sempre que se cria um objeto de uma classe usando apenas o nome da classe seguido pelo nome da variável, como eu fiz na linha 24 com o objeto de tipo Filme chamado desconhecido, o construtor padrão é invocado para que o objeto seja construído. O construtor padrão inicializa os atributos do objeto (as variáveis pertencentes à classe que não foram declaradas como static – para saber mais sobre classes em C++, leia meu artigo sobre o tema) com os valores resultantes da inicialização padrão para o tipo de cada um dos atributos (o que normalmente significa que os valores permanecem em um estado indefinido – o que não é bom).

Para evitar que os atributos da classe permaneçam com valores indefinidos, há duas opções: pode-se fornecer valores padrões para os atributos através dos inicializadores “in-class” (do inglês in-class initializers), como eu fiz nas linhas 18, 19 e 20; ou, então, pode-se também fornecer valores padrões usando a lista de inicialização do construtor (veja a seção “Construtor de uma classe em C++” no meu artigo sobre o classes), como mostrado no exemplo a seguir.

// Construtor padrão com lista de inicialização para os atributos da classe
Filme() : titulo("sem titulo"), diretor("ninguem"),
             anoDeLancamento(9999) {}

Note também que esse construtor normalmente não recebe nenhum argumento, e é possível “pedir” ao compilador para que ele seja gerado automaticamente para nós usando a combinação = default após os parênteses (como fiz na linha 14 do exemplo #1). Todavia, também é possível usar um construtor que fornece valores padrões para todos os seus parâmetros como construtor padrão, como mostrado no exemplo a seguir.


Exemplo 2 – Constructor por parâmetros usado como construtor padrão

/******************************************
* Exemplo #2 - Como criar um objeto em C++
* Construtor por parâmetros usado como padrão
*******************************************/
class Filme {
// ... resto da classe como antes, sem a declaração do construtor
// padrão Filme() = default
Filme(const string& iTitulo = "sem titulo",
      const string& iDiretor = "ninguem",
      const unsigned int iAnoDeLancamento = 9999) : 
            titulo(iTitulo), diretor(iDiretor), 
            anoDeLancamento(iAnoDeLancamento) {}
};

int main() {
    Filme() desconhecido;

    cout << "O filme é " << desconhecido.titulo << ", do diretor " 
         << desconhecido.diretor << ", lançado em " 
         << desconhecido.anoDeLancamento << "." << endl;

    return 0;
}

Saída:

O filme é sem titulo, do diretor ninguem, lançado em 9999.


Criar objeto em C++ usando o Construtor por cópia

Quando se deseja criar um objeto a partir de um outro objeto da mesma classe, pode-se usar o construtor por cópia, que permite copiar os valores dos atributos de um objeto para o outro (ou fazer algo a mais, no caso de dados membros da classe que sejam ponteiros). No nosso caso, como temos apenas tipos de dados simples no nosso objeto (strings e unsigned int), pedimos para. que o construtor sintetize para nós esse construtor (assim como fizemos com o construtor padrão) usando = default. Vejamos abaixo um exemplo.


Exemplo 3 – Criação de objeto com o construtor por cópia

/******************************************
* Exemplo #3 - Como criar um objeto em C++
* Objeto criado pelo construtor por cópia
*******************************************/
int main() {
    Filme rocky{"Rocky", "John G. Avildsen", 1976};
    Filme copiaDeRocky{rocky};
    
    cout << "O filme é " << rocky.titulo << ", do diretor " 
         << rocky.diretor << ", lançado em "
         << rocky.anoDeLancamento << "." << endl;

    cout << "O filme é " << copiaDeRocky.titulo << ", do diretor " 
         << copiaDeRocky.diretor << ", lançado em " 
         << copiaDeRocky.anoDeLancamento << "." << endl;

    return 0;
}

Saída:

O filme é Rocky, do diretor John G. Avildsen, lançado em 1976.
O filme é Rocky, do diretor John G. Avildsen, lançado em 1976.


Além dos construtores por cópia, há os seus “irmãos”, os construtores por deslocamento (ou construtores de movimento), mas eles consistem em um assunto mais avançado que merece ser tratado em um artigo à parte.


Criar objeto em C++ usando o Construtor por parâmetros

Uma outra ferramenta para se criar objetos em C++ são os construtores por parâmetros, que permitem atribuir valores aos atributos do objeto criado diretamente durante sua criação (idealmente usando a lista de inicialização do construtor). Podemos ver no exemplo #1 a definição de um construtor por parâmetros para nossa classe Filme que recebe o título do filme, o nome do diretor e o seu ano de lançamento, e no exemplo #3 vemos o uso desse construtor para se criar um objeto da classe Filme que representa o filme Rocky. Veja a seguir um outro exemplo que utiliza o construtor por parâmetros para criar um objeto Filme para representar o filme “A felicidade não se compra”, de Frank Capra.


Exemplo 4 – Criação de objeto com o construtor por parâmetros

/******************************************
* Exemplo #4 - Como criar um objeto em C++
* Objeto criado pelo construtor por parâmetros
*******************************************/

int main() {
    Filme aFelicidadeNaoSeCompra{"A Felicidade não se compra", 
                                 "Frank Capra", 1946};
    
    cout << "O filme é " << aFelicidadeNaoSeCompra.titulo 
         << ", do diretor " << aFelicidadeNaoSeCompra.diretor
         << ", lançado em " << aFelicidadeNaoSeCompra.anoDeLancamento
         << "." << endl;

    return 0;
}

Saída:

O filme é A Felicidade não se compra, do diretor Frank Capra, lançado em 1946.


Próximos assuntos

Conhecendo os principais tipos de construtores em C++, você está pronto para passar ao próximo passo no seu aprendizado acerca das classes em C++: herança entre classes. Te vejo lá!

Foto de perfil de Emanoel

Sou apaixonado por tecnologia, literatura e também filosofia. O cultivo dessas paixões ao longo da minha trajetória me inspiraram a compartilhar aquilo que aprendo com os outros da maneira mais clara que eu possa. Sou formado em Engenharia Elétrica no Brasil, e também sou engenheiro formado na França. Trabalho atualmente como programador C++ em uma multinacional francesa, uma das maiores empresas de TI do mundo.

Leave a Reply

Your email address will not be published. Required fields are marked *