Click to See Complete Forum and Search --> : Casting...help please...
hometown
April 28th, 2003, 12:40 PM
Could you tell me if there is any difference between the two types of casting:
(int)MyVar and static_cast<int>MyVar.
If no, could you tell me why static_cast has been used instead of (directly) casting method as that former does above ?
Thank you very much...
Regards,
Nina.
PaulWendt
April 28th, 2003, 01:32 PM
You'd learn the answer in any introductory C++ text book.
I strongly recommend you read some beginner-level C++ text
book; you'll learn other things than just this.
To make a long [better] answer short, static_cast is one of four
C++ style casts. In this instance, no benefit can be seen other
than the fact that doing lexicographical searches for casts in
many files will be much simpler.
To get the full story, though, read a C++ text book.
--Paul
Graham
April 28th, 2003, 01:51 PM
C-style casts are closer to reinterpret_cast - i.e. they're bl**dy dangerous since they'll do what you ask with no checks.
static_cast won't cast away cv-qualification: there's one difference.
proxima centaur
April 28th, 2003, 02:41 PM
There has been a discussion on that topic on this board. Do a search.
Andreas Masur
April 28th, 2003, 02:56 PM
Casting means you change the representation of a variable by changing its type to a different one. In order to type-cast a simple object to another you use the traditional type casting operator. For example, to cast a floating point number of type 'double' to an integer of type 'int':
int i;
double d;
i = (int) d;
or also
i = int (d);
This is quite good for basic types that have standard defined conversions, however this operators can also been indiscriminately applied on classes and pointers to classes. ANSI-C++ standard has defined four new casting operators: 'reinterpret_cast', 'static_cast', 'dynamic_cast' and 'const_cast' in order to control these types of conversions between classes...
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)
reinterpret_cast
'reinterpret_cast' casts a pointer to any other type of pointer. It also allows casting from pointer to an integer type and vice versa.
This operator can cast pointers between non-related classed. The operation results is a simple binary copy of the value from a pointer to the other. The content pointed does not pass any kind of check nor transformation between types.
In the case that the copy is performed from a pointer to an integer, the interpretation of its content is system dependent and therefore any implementation is non portable. A pointer casted to an integer enough large to fully contain it can be casted back to a valid pointer.
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
'reinterpret_cast' treats all pointers exactly as traditional type-casting operators do.
static_cast
'static_cast' allows to perform any casting that can be implicitly performed as well as also the inverse cast (even if this is not allowed implicitly).
Applied to pointers to classes, that is to say that it allows to cast a pointer of a derived class to its base class (this is a valid conversion that can be implicitly performed) and can also perform the inverse: cast a base class to its derivated class.
In this last case the base class that is being casted is not checked to determine wether this is a complete class of the destination type or not.
class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = static_cast<Derived *>(a);
'static_cast', aside from manipulating pointers to classes, can also be used to perform conversions explicitly defined in classes, as well as to perform standard conversions between fundamental types:
double d = 3.14159265;
int i = static_cast<int>(d);
dynamic_cast
'dynamic_cast' is exclusively used with pointers and references to objects. It allows any type-casting that can be implicitly performed as well as the inverse one when used with polymorphic classes, however, unlike static_cast, dynamic_cast checks, in this last case, if the operation is valid. That is to say, it checks if the casting is going to return a valid complete object of the requested type.
Checking is performed during run-time execution. If the pointer being casted is not a pointer to a valid complete object of the requested type, the value returned is a 'NULL' pointer.
class Base { virtual dummy() {} };
class Derived : public Base {};
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns 'NULL'
If the type-casting is performed to a reference type and this casting is not possible an exception of type 'bad_cast' is thrown:
class Base { virtual dummy() {} };
class Derived : public Base { };
Base* b1 = new Derived;
Base* b2 = new Base;
Derived d1 = dynamic_cast<Derived &*>(b1); // succeeds
Derived d2 = dynamic_cast<Derived &*>(b2); [COLOR=#008800]// fails: exception thrown
const_cast
This type of casting manipulates the const attribute of the passed object, either to be set or removed:
class C {};
const C *a = new C;
C *b = const_cast<C *>(a);
Neither of the other three new cast operators can modify the constness of an object.
hometown
April 29th, 2003, 03:52 AM
Regards,
Nina.
codeguru.com
Copyright Internet.com Inc., All Rights Reserved.