- •Void init (int aa,bb,int cc){
- •Void show()
- •Int main()
- •Int getx() {return X;}
- •Void my_terminate()
- •Int main()
- •Int before (const type_info& rhs) const;
- •Int main(){
- •Void fun ( figure & f ){
- •Int main (){
- •Int main(){
- •Void f1 ( const int * a ){
- •Void f2 ( const int& a){
- •Int main () {
- •Int main(){
- •Int main (){
- •Int main(){
- •Int main(){
Void f1 ( const int * a ){
int * p = const_cast< int * > ( a );
*p = *a * *a;
}
Void f2 ( const int& a){
const_cast<int & > ( a ) = a * a;
}
Int main () {
int i = 2;
cout << i << " " ;
f1 (&i);
cout << i << " ";
f2( i );
cout << i << " ";
return 0 ;
}
// =================
Output:
2 4 16
// =================
2.27
Оператор reinterpret_cast.
reinterpret_cast < type > ( expr )
Особенности:
используется для работы с битовыми областями данных - преобразования несовместимых типов указателей, а также для преобразования целых типов в указатели и наоборот
нельзя использовать для преобразования типов с const и volatile
не рекомендуется к использованию ( не безопасен )
expr - выражение, которое приводится к новому типу
type - результирующий тип
#include <iostream>
using namespace std;
Int main(){
char *s = "string";
int i = reinterpret_cast < int > ( s );
cout << i;
return 0;
}
// ==============
Output:
4260188
//===============
2.28
Оператор static_cast.
static_cast < type > ( expr )
Особенности:
используется для неполиморфного приведения типов - можно применять для любого стандартного приведения типов как и обычный оператор приведения
может быть применен для преобразования указателя на базовый класс к указателю на производный класс, но это не всегда безопасно и никаких проверок во вермя преобразования не производится
нельзя использовать для преобразования типов с модификаторами const и volatile
#include < iostream >
using namespace std;
Int main (){
for ( int i = 0; i < 10; ++i)
cout << static_cast< double > ( i ) / 3 << " ";
return 0;
}
// ========
Output:
0 0.333333 0.666667 1 1.3333333 1.666667 2 2.33333 2.666667 3
// ========
#include < iostream >
using namespace std;
class B{
public :
int b;
void init() { b = 0; cout << " B::init() ";}
virtual void show () { cout << "B::show() ";}
};
class D: public B{
public:
int d;
void init(){ b = d = 0; cout << " D::init() ";}
void show(){ cout << " D:;show() ";}
};
Int main(){
B * pb, b;
D * pd, d;
pb = &d;
pd = static_cast< D* > ( pb );
pd->show();
pd->init();
pb = &b;
pd = static_cast < D* > ( pb );
pd->show();
pd->init();
return 0 ;
}
// ====================
Run-Time Check Failure - Stack aroun the variable 'b' was corrupted.
D::show() D::init() B::show() D::init()
2.29
Оператор dynamic_cast.
Особенности:
используется для динамического приведения полиморфных типов ( указателей или ссылок ) с проверкой корректности приведения во время выполнения программы
если приведение оказывается некорректным, то оно не выполняется - формируется признак ошибки
нельзя использовать для преобразования типов с const и volatile
expr - выражение, которое приводится к новому типу, должно вычислять указатель или ссылку
type - результирующий тип ( указатель или ссылка )
Правила приведения полиморфных типов:
оператор dynamic_cast выполняется успешно, если указатель или ссылка, подвергающаяся приведению, в момент приведения ссылается на объект результирующего еласс или производного от результирующего
при невозможности динамического приведения возвращается нулевой указатель ( применитльно к указателям ) или генерируется исключительная ситуация bad_cast ( применительно к ссылкам )
Если даны класс Вase и производный от него класс Derived:
приведение указателя Derived* к типу Вase* возможно ВСЕГДА - по стандартным правилам наследования указатель на базовый класс может ссылаться на объект производного класса
приведение указателя Base* к типу Derived* возможно лишь в случае, когда указатель Base* в момент приведения действмительно ссылается на объект класса Derived
#include < iostream >
#include < typeinfo >
using namespace std;
class B{
public :
int b;
void init() { b = 0; cout << " B::init() ";}
virtual void show () { cout << "B::show() ";}
};
class D: public B{
public:
int d;
void init(){ b = d = 0; cout << " D::init() ";}
void show(){ cout << " D:;show() ";}
};
