C++ Constructor explicit Keyword

Introduction

A class constructors with a single parameter can be implicit casted from the type of the parameter to the class type.

#include <iostream>
 
class Cube {//  ww  w .  j  ava 2s.  c o m
public:
  double side;
 
  Cube(double side);                        // Constructor
  double volume();                          // Calculate volume of a cube
  bool compareVolume(Cube aCube);           // Compare volume of a cube with another
};
 
Cube::Cube(double len) : side {len} { std::cout << "Cube constructor called." << std::endl; }
double Cube::volume() { return side*side*side; }
bool Cube::compareVolume(Cube aCube) { return volume() > aCube.volume(); }
 
// Problems of implicit object conversions
 
int main() {
  Cube pool1 {7.0};
  Cube pool2 {3.0};
 
  if(pool1.compareVolume(pool2))
    std::cout << "pool1 is larger than pool2." << std::endl;
  else
    std::cout << "pool1 is less than or equal to pool2." << std::endl;
 
  std::cout << "volume of pool1 is" << pool1.volume() << std::endl;
  if(pool1.compareVolume(50.0))
    std::cout << "Volume of pool1 is greater  than 50" << std::endl;
  else
    std::cout << "Volume of pool1 is less than or equal to 50" << std::endl;
}
 

The code the compiler produces is equivalent to:

 
if(pool1.compareVolume(Cube {50.0}))
  std::cout << "Volume of pool1 is greater  than 50" << std::endl;
else
  std::cout << "Volume of pool1 is less than or equal to 50" << std::endl;
 

You can prevent this nightmare from happening by declaring the constructor as explicit:

 
class Cube {
public:
  double side;
 
  explicit Cube(double side);               // Constructor
  double volume();                          // Calculate volume of a cube
  bool compareVolume(Cube aCube);           // Compare volume of a cube with another
};



PreviousNext

Related