重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C语言中,存在强制类型转换的概念。在C++中,C的做法同样适用。但是,C++也有自己的类型转换的方式,就是使用reinterpret_cast<>。例如,
成都创新互联公司从2013年创立,先为亳州等服务建站,亳州等地企业,进行企业商务咨询服务。为亳州企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。char* str = "chentong"; int* p = reinterpret_cast(str);
通过这种方式,就把指向char*类型的str,强制转换成了指向int*。
仅仅这样做,是不够的。因为,str指向的一个字符串,一个确定的字符串,也就是说,要求是不可改写,也就是可读不可写。所以,为了达到这一目的,我们将str指向的内容不可修改。操作如下:
const char* str = "chentong";
这样做后,确实,str所指向的内容不可修改了,但是,这样做,又带来一个问题,那就是,reinterpre_cast<>这种强制转换,不可以去掉类似与const这样的属性。所以,我们要通过一些手段,将str的const属性去掉。幸运的是,C++确实提供了解决方案。通过const_cast<>。代码如下:
const char* str = "chentong"; char* str2 = const_cast < char* > ( str );
这样一来,就去掉了str的const属性。
那么,完整的操作方式,
const char* str = "chentong"; char* str2 = const_cast < char* > ( str ); int* p = reinterpret_cast < char* > ( str2 );
这样就完成了类型的转换。
接下来讲一下动态类型转换。首先得清楚的是,动态类型转换,只能用于存在虚函数的类。假设我有三个类,
class Human { public: virtual void eating( void ) { cout << "use hand to eat" << endl; } }; class Englishman : public Human { public: //覆写 void eating(void) { cout << "use knife to eat" << endl; } }; class Chinese : public Human { public: void eating(void) { cout << "use chopstick to eat" << endl; } };
然后我在global space中实现,对于不同国家的人有不同的吃饭方式这样一个函数。
void test_eating(Human& h) { h.eating(); }
现在,我还想分辨这个人是英国人还是中国人。那么,我该怎么做呢?
void test_eating(Human& h) { Englishman* pe = NULL; Chinese *pc = NULL; h.eating(); if ( pe == dynamic_cast < Englishman* > ( &h ) ); cout << "this is Englishman" << endl; if ( pc == dynamic_cast < Chinese* > ( &h ) ) cout << "this is Chinese" << endl; }
在test_eating()函数中,我先定义两个变量,分别指向Englishman*和Chinese类型。那么,它是如何动态转换的呢?当一个类中有虚函数时,根据该类所创建的类对象中就会有一个指针,这个指针指向虚函数表,这个虚函数表中,含有类信息,根据这个类信息,就知道这个对象是属于哪个类的。所以,这个类信息就可以确定Human& h的h,是哪个类的。
最后,静态类型转换static_cast<>在进行上行转换时,是安全的。而在下行转换时,没有动态的检查,所以是不安全的,只有你编写代码时去检查是否符合逻辑。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。