Explicit Constructor
Constructors declared explicit are usually preferable to non-explicit once, because they prevent compilers from performing unexpected (often unintended) type conversions. Unless I have a good reason for allowing a constructor to be used for implicit type conversions, I declare it explicit. I encourage you to follow the same policy.
#include <cstdlib>
#include <iostream>
using namespace std;
class MyClass
{
private:
int m_paramInt;
bool m_paramBool;
public:
explicit MyClass(int x = 0, bool b = true) // default constructor, can be called without any argumrnts
{
m_paramInt = x;
m_paramBool = b;
}
void printAll();
};
void MyClass::printAll()
{
std::cout << "\n " << m_paramInt << " " << m_paramBool;
}
void doSomeThing(MyClass explicitObject)
{
explicitObject.printAll();
}
int main(int argc, char *argv[])
{
MyClass b1; // fine, both arguments are default
b1.printAll(); // 0 1
MyClass b2(28); // fine, second argument is default
b2.printAll(); // 28 1
doSomeThing(b1); // fine, passes a MyClass to doSomeThing
// 0 1
doSomeThing(MyClass(25)); // fine, passes a MyClass to doSomeThing
// 25 1
#if 0
doSomeThing(30); // error!, doSomeThing takes a Myclass, not an int,
// and there is no implicit conversion from int to Myclass
// fine, if explicit is removed from MyClass constructor
// 30 1
#endif
system("PAUSE");
return EXIT_SUCCESS;
}