类型转换和异常处理

一、类型转换
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;//这是个纯虚函数,为了就是多态;
};
//派生类1
class Child1:public Father 
{
public:
    virtual void sleep()
    {
        printf ("child1吃饭\n");
    }

    void child1()
    {
        printf ("child1 打游戏\n");
    }
};
//派生类2
class 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值