Use of explicit keyword in C++ - GeeksforGeeks

02 May, 2022
Explicit Keyword in C++ is used to mark constructors to not implicitly convert types in C++. It is optional for constructors that take exactly one argument and work on constructors(with a single argument) since those are the only constructors that can be used in typecasting.
Let’s understand explicit keyword through an example. 
Predict the output of the following C++ Program
CPP
// C++ program to illustrate default// constructor without 'explicit'// keyword#include <iostream>using namespace std; class Complex {private:    double real;    double imag; public:       // Default constructor    Complex(double r = 0.0,            double i = 0.0) : real(r),                              imag(i)    {    }     // A method to compare two    // Complex numbers    bool operator == (Complex rhs)    {        return (real == rhs.real &&                imag == rhs.imag);    }}; // Driver Codeint main(){    // a Complex object    Complex com1(3.0, 0.0);     if (com1 == 3.0)        cout << "Same";    else        cout << "Not Same";    return 0;}
Same
As discussed in this article, in C++, if a class has a constructor which can be called with a single argument, then this constructor becomes a conversion constructor because such a constructor allows conversion of the single argument to the class being constructed. We can avoid such implicit conversions as these may lead to unexpected results. We can make the constructor explicit with the help of an explicit keyword. For example, if we try the following program that uses explicit keywords with a constructor, we get a compilation error.
CPP
// C++ program to illustrate// default constructor with// 'explicit' keyword#include <iostream>using namespace std; class Complex {private:    double real;    double imag; public:    // Default constructor    explicit Complex(double r = 0.0,                     double i = 0.0) :                     real(r), imag(i)    {    }     // A method to compare two    // Complex numbers    bool operator == (Complex rhs)    {        return (real == rhs.real &&                imag == rhs.imag);    }}; // Driver Codeint main(){    // a Complex object    Complex com1(3.0, 0.0);     if (com1 == 3.0)        cout << "Same";    else        cout << "Not Same";    return 0;}
Output
Compiler Error : no match for 'operator==' in 'com1 == 3.0e+0'
We can still typecast the double values to Complex, but now we have to explicitly typecast it. For example, the following program works fine.
CPP
// C++ program to illustrate// default constructor with// 'explicit' keyword#include <iostream>using namespace std; class Complex {private:    double real;    double imag; public:       // Default constructor    explicit Complex(double r = 0.0,                     double i = 0.0):                     real(r) , imag(i)    {    }     // A method to compare two    // Complex numbers    bool operator == (Complex rhs)    {        return (real == rhs.real &&                imag == rhs.imag);    }}; // Driver Codeint main(){    // a Complex object    Complex com1(3.0, 0.0);     if (com1 == (Complex)3.0)        cout << "Same";    else        cout << "Not Same";    return 0;}
Same
Note: The explicit specifier can be used with a constant expression. However, if that constant expression evaluates to true, then only the function is explicit.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
anshikajain26
jayeshtpatel
C Language
C++
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multidimensional Arrays in C / C++
Left Shift and Right Shift Operators in C/C++
fork() in C
Core Dump (Segmentation fault) in C/C++
Function Pointer in C
Vector in C++ STL
Inheritance in C++
Initialize a vector in C++ (6 different ways)
Map in C++ Standard Template Library (STL)
C++ Classes and Objects