大家好,欢迎来到IT知识分享网。
static_cast
static_cast是一个计算机函数,功能是把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
int i;
float f = 166.71;
i = static_cast<int>(f);
printf(“%d\n”, i);
166
reinterpret_cast
char p[] = “”;
printf(“%d\n”, p);
i = reinterpret_cast<int>(p);
printf(“%d\n”, i);
此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i。
i = static_cast<int>(p);
error C2440: “static_cast”: 无法从“char [7]”转换为“int”
dynamic_cast
在上行转换中,static_cast和dynamic_cast效果是一样的,而且都比较安全,因为向上转换的对象一般是指向子类对象的子类类型指针;而在下行转换中,由于可以定义就不同了指向子类对象的父类类型指针,同时static_cast只在编译时进行类型检查,而dynamic_cast是运行时类型检查,则需要视情况而定。
class Base
{
virtual void fun() {}
};
class Derived :public Base
{
public:
void fun1()
{
printf(“Hello World\n”);
};
};
Base *P = new Derived();
Derived *pd1 = static_cast<Derived *>(P);
Derived *pd2 = dynamic_cast<Derived *>(P);
pd1->fun1();
pd2->fun1();
Hello World
Hello World
上行转换,static_cast和dynamic_cast效果一样,都安全;
class Base
{
virtual void fun() {}
};
class Derived :public Base
{
public:
Derived()
{
mmm = 33;
};
void fun1()
{
printf(“Hello World: %d\n”, mmm);
};
private:
int mmm;
};
Base *P = new Base;
Derived *pd3 = static_cast<Derived *>(P);
Derived *pd4 = dynamic_cast<Derived *>(P);
if (pd3)
{
pd3->fun1();
}
if (pd4)
{
pd4->fun1();
}
Hello World: –
对于下行转换:你必须确定要转换的数据确实是目标类型的数据,即需要注意要转换的父类类型指针是否真的指向子类对象,如果是,static_cast和dynamic_cast都能成功;如果不是static_cast能返回,但是不安全,可能会出现访问越界错误,而dynamic_cast在运行时类型检查过程中,判定该过程不能转换,返回NULL。
const_cast
const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。
const int variable = 21;
variable = 22;
编译报错error C3892: “variable”: 不能给常量赋值。
如果想修改const值可以采用const_cast
const int variable = 21;
int* aa = const_cast<int*>(&variable);
int* const_p = const_cast<int*>(&variable);
cout << “variable 1 :” << variable << endl;
cout << “variable 2 :” << *const_p << endl;
*const_p = 7;
cout << “variable 3:” << variable << endl;
cout << “variable 4 :” << *const_p << endl;
21
21.
21
7
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85413.html