Using the Const_cast Operator in C++
The const_cast operator in C++ can be used to remove the const, volatile, and __unaligned attribute(s) from a class.
const_cast < type-id > ( expression )
A pointer to any object type or a pointer to a data member can be explicitly converted to a type that is identical except for the const, volatile, and __unaligned qualifiers. For pointers and references, the result will refer to the original object. For pointers to data members, the result will refer to the same member as the original (uncast) pointer to data member. Depending on the type of the referenced object, a write operation through the resulting pointer, reference, or pointer to data member might produce undefined behavior.
You cannot use the const_cast operator to directly override a constant variable's constant status.
You cannot use const_cast for any other types of casts, such as casting a base class pointer to a derived class pointer. If you do so, the compiler will report an error.
The const_cast operator converts a null pointer value to the null pointer value of the destination type.
Example 1
#include <iostream.h>
class CCTest {
public:
void setNumber( int );
void printNumber() const;
private:
int number;
};
void CCTest::setNumber( int num ) { number = num; }
void CCTest::printNumber() const {
cout << "
Before: " << number;
const_cast< CCTest * >( this )->number--;
cout << "
After: " << number;
}
void main() {
CCTest X;
X.setNumber( 8 );
X.printNumber();
}
On the line containing the const_cast, the data type of the this
pointer is const CCTest *
. The const_cast operator changes the data type of the this
pointer to CCTest *
, allowing the member number
to be modified. The cast lasts only for the remainder of the line on which it appears.
Example 2
Consider a function, f, which takes a non-const argument:
double f( double& d );
Say you wish to call f from another function g:
void g (const double& d) { val = f(d); }
Because d is const and should not be modified, the compiler will complain because f may potentially modify its value. To get around this dilemma, use a const_cast:
void g (const double& d)
{
val = f(const_cast<double&>(d));
}
This strips away the ``const-ness'' of d before passing it to f.