类型转换和异常处理

来源:互联网 发布:淘宝运营 策划 编辑:程序博客网 时间:2024/06/05 17:15

一、类型转换
1、c语言的转换
在c语言中存在隐性转换,所谓隐性准换就是编译器在运行程序的时候自动的帮你转换了类型;
例如:
int a = 10;
double d = 2.1;
a = d;//c语言中的隐性转换;
char ch = (char) a; //c语言中的强制转换

2、c++中的类型转换
(1)、static_cast
(1_1)用于基本类型之间的转换,但是!不可以进行基本指针之间的转换
(1_2)可以用于有继承关系的类之间的对象的转换和类指针的转换
(1_3)例子:
Father *f = NULL;//父类指针
Child c; //派生类对象;
F = static_cast

//基类class Father {public:    virtual void sleep() = 0;//这是个纯虚函数,为了就是多态;};//派生类1class Child1:public Father {public:    virtual void sleep()    {        printf ("child1吃饭\n");    }    void child1()    {        printf ("child1 打游戏\n");    }};//派生类2class Child2:public Father {public:    virtual void sleep()    {        printf ("Child2吃饭\n");    }    void Child2()    {        printf ("Child2学习\n");    }};//基类指针做参数的函数Void func(Father *p){P->sleep();  //参数类型是父类的指针,传进来的指针按道理只可以指向父类的函数//子类的指针传进来之后因为sleep虚函数的原因,实现多态可以指向子类内部的函数Child1 *c = dynamic_cast<Chidl 1*>(p);//这里基类的指针会先进行匹配,匹配成功,即传进来的是Child1类的对象指针//匹配成功之后进行强制转换;//把基类的指针p转换成派生类指针,这样基类指针p可以指向派生类的成员函数;//如果匹配不成功,返回NULL;If(c != NULL ){P->child1();}}

(3)const_cast
去掉变量的只读属性
例如:

Void print(const  char *str){//const  char *str,这句话,复习下c语言,这句话const修饰的是*,表示被指向的对象的内容不可以改变//char * const str  这句话表示指针str不可以变;也就是str的指向不可以变;char *p = const<char *>(str);//这样就可以改变str指向的内容;P[2] = ‘w’; //假设str指向的内容是字符串”hello”,那这句话改变str指向内容 即l---->w;}

(4)reinterpret_cast
(4_1)用于整形和指针之间的转换
int a;
Int *b = reinterpret_cast

类Student和类Animal之间没有关系Animal c;Student *s1 = reinterpret_cast<Student*>(&c);

二、异常
1、概念
(1)异常是一种程序控制机制,与函数机制独立和互补
函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈.
(2)异常设计目的:
栈机制是一种高度节律性控制机制,面向对象编程却要求对象之间有方向、有目的的控制传动,从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了进行错误处理。异常设计出来之后,却发现在错误处理方面获得了最大的好处。
2、异常的用法
// 1、可能发生异常的代码要放到 try块里,异常是需要人为抛的 通过 throw
// 2、异常是跨函数的
// 3、捕获到异常:1、处理它 不让它继续向上抛 2、不处理,继续向上抛
// 4、catch 去进行异常捕捉的时候,要严格遵循类型匹配,和 模板的类型匹配程序相同,不允许做类型的隐式转换
//5、在可能发生异常的代码端进行判断,判断符合出现异常的条件,进行抛出异常
例子:下面的代码,func1里边有处理异常的函数,单数func1里边的异常处理函数不处理异常,所以继续往上抛,就到了调用func1的主函数,到主函数里边去处理异常,符合了上面的用法的第三句话;可能发生异常的语句放在try里边;

void func1(){    try    {        divid(10,0);    }    catch (int e)    {        // printf ("func1 处理了异常:%d 整除 0\n", e);        printf ("func1 捕获了异常, 不高兴处理了\n");        throw;  // 不处理的情况下,一定要调用 throw 向上抛    }    catch (...)    {        printf ("其他类型异常\n");    }    printf ("111111111111111111111\n");}void divid(int x, int y){    if (y == 0)    {        //  return;        throw x;   // 抛出一个异常,类似与 return 返回值    }    printf ("%d / %d = %d\n", x, y, x/y);}int main2_2(){    try    {        func1();    }    catch (int e)    {        printf ("捕获一个异常:%d 整除 0\n", e);    }    catch (...)    {        printf ("其他类型异常\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击