'Converting Constructor' e 'Explicit' em C++

Em C++, se você possuir uma classe MeuInteiro e criar para ela um construtor que recebe apenas um objeto (por exemplo, um int) como argumento, ao fazer um assignment de um objeto int para um MeuInteiro, este construtor será executado.

Exemplo:

#include ⟨cstdio⟩

class MeuInteiro {
public:
        MeuInteiro(int);
};

MeuInteiro::MeuInteiro(int _x)
{
        printf("Construtor MeuInteiro(%d)\n", _x);
}

int main(void)
{ 
        MeuInteiro m = 10;
        return 0;
}

A saída deste programa será:


Construtor MeuInteiro(10) 

Esta conversão de tipo também acontece ao passarmos um inteiro como argumento para funções que recebam o objeto MeuInteiro. Por exemplo, se adicionarmos a função func que recebe um MeuInteiro:

void func(MeuInteiro _m)
{
        printf("func(MeuInteiro);\n");
}


E a chamarmos no main passando um inteiro como argumento:

int main(void)
{ 
        MeuInteiro m = 10;
        func(15);
        return 0;
}


A saída será:
Construtor MeuInteiro(10)
Construtor MeuInteiro(15)
func(MeuInteiro);

No entanto, se você não quiser que essa conversão implícita aconteça, você pode acrescentar a keyword explicit ao construtor. Desta forma, haverá erro de compilação, pois não é possível converter  int para MeuInteiro.

Aqui vai o exemplo, que demonstra o parágrafo anterior, e sua saída:

convconstr.cpp
#include ⟨cstdio⟩

class MeuInteiro {
public:
        explicit MeuInteiro(int);
};

MeuInteiro::MeuInteiro(int _x)
{
        printf("Construtor MeuInteiro(%d)\n", _x);
}

void func(MeuInteiro _m)
{
        printf("func(MeuInteiro);\n");
}

int main(void)
{ 
        MeuInteiro m = 10;
        func(15);
        return 0;
}

Saída:
g++ -Wall convconstr.cpp -o convconstr

convconstr.cpp: In function ‘int main()’:
convconstr.cpp:20:17: error: conversion from ‘int’ to non-scalar type ‘MeuInteiro’ requested
convconstr.cpp:21:9: error: conversion from ‘int’ to non-scalar type ‘MeuInteiro’ requested

Estas chamadas implícitas também acontecem com o copy-constructor. Mas tornar o copy-constructor explicit provavelmente será má ideia. Uma classe com o copy-constructor explícito significa que não é possível passar objetos por valor a nenhuma função, ou realizar inicializações utilizando o operador =. Aqui há uma thread do cplusplus a este respeito: http://www.cplusplus.com/forum/unices/62973/

Nenhum comentário on "'Converting Constructor' e 'Explicit' em C++"

Leave a Reply