static_cast、dynamic_cast、reinterpret_cast、const_cast了解

static_cast、dynamic_cast、reinterpret_cast、const_cast了解功能是把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。inti;floatf=166.71;i=static_cast<int>。

大家好,欢迎来到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

static_cast、dynamic_cast、reinterpret_cast、const_cast了解

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/85413.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信