汽车案例网站,学院网站建设需求分析调研表,提高网站响应速度,wordpress百度主动不推送了static_castnew_type (expression) 虽然const_cast是用来去除变量的const限定#xff0c;但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的#xff0c;static决定的是一个变量的作用域和生命周期#xff0c;比如#xff1a;在一个文件中将变量…static_castnew_type (expression) 虽然const_cast是用来去除变量的const限定但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的static决定的是一个变量的作用域和生命周期比如在一个文件中将变量定义为static则说明这个变量只能在本Package中使用在方法中定义一个static变量该变量在程序开始存在直到程序结束类中定义一个static成员该成员随类的第一个对象出现时出现并且可以被该类的所有对象所使用。 对static限定的改变必然会造成范围性的影响而const限定的只是变量或对象自身。但无论是哪一个限定它们都是在变量一出生完成编译的时候就决定了变量的特性所以实际上都是不容许改变的。这点在const_cast那部分就已经体现出来。 static_cast和reinterpret_cast一样在面对const的时候都无能为力两者都不能去除const限定。两者也存在很多的不同比如static_cast不仅可以用在指针和引用上还可以用在基础数据和对象上reinterpret_cast可以用在没有关系的类型之间而用static_cast来处理的转换就需要两者具有一定的关系了。 常用场合 1、编译器隐式执行的任何类型转换都可以由static_cast来完成比如int与float、double与char、enum与int之间的转换等。 double a 1.999;
int b static_castint(a); //相当于b a ; 当编译器隐式执行类型转换时大多数的编译器都会给出一个警告 e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 从“double”转换到“int”可能丢失数据 使用static_cast可以明确告诉编译器这种损失精度的转换是在知情的情况下进行的也可以让阅读程序的其它程序员明确你是有意识的转换而不是由于疏忽。 把精度大的类型转换为精度小的类型static使用位截断进行处理。 2、使用static_cast可以找回存放在void*指针中的值。 double a 1.999;
void * vptr a;
double * dptr static_castdouble*(vptr);
cout*dptrendl;//输出1.999 3、static_cast也可以用在基类与派生类指针或引用类型之间的转换。然而它不做运行时的检查不如dynamic_cast安全。static_cast仅仅是依靠类型转换语句中提供的信息来进行转换而dynamic_cast则会遍历整个类继承体系进行类型检查因此dynamic_cast在执行效率上会比static_cast要差一些。 现在我们有父类与其派生类如下 class ANIMAL
{
public:ANIMAL():_type(ANIMAL){};virtual void OutPutname(){coutANIMAL;};
private:string _type ;
};
class DOG:public ANIMAL
{
public:DOG():_name(大黄),_type(DOG){};void OutPutname(){cout_name;};void OutPuttype(){cout_type;};
private:string _name ;string _type ;
}; 此时我们进行派生类与基类类型指针的转换注意从下向上子类到基类的转换是安全的从上向下基类到子类的转换不一定安全。 int main()
{//基类指针转为派生类指针,且该基类指针指向基类对象。ANIMAL * ani1 new ANIMAL ;DOG * dog1 static_castDOG*(ani1);//dog1-OutPuttype();//错误在ANIMAL类型指针不能调用方法OutPutType在运行时出现错误。//基类指针转为派生类指针且该基类指针指向派生类对象ANIMAL * ani3 new DOG;DOG* dog3 static_castDOG*(ani3);dog3-OutPutname(); //正确//system(pause);} 从上边对static_cast分析可以看出static_cast跟传统转换方式几乎是一致的所以只要将static_cast和圆括号去掉再将尖括号改成圆括号就变成了传统的显式转换方式。 转自 http://www.cnblogs.com/ider/archive/2011/07/31/cpp_cast_operator_part4.html http://www.cnblogs.com/QG-whz/p/4509710.html