一、类型转换
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;
}