c++ 运算符,c语言字符怎么转换成运算符
标准的C转换运算符const_cast谈到了C对C语言传统类型转换方法的继承和扩展,最后留下了一些关于指针和引用转换的问题,不做详细描述。与C相比,C是一种面向对象的语言。面向对象最大的特点之一就是“多态性”。
要想利用好多态,必然要用到指针和引号,必然会遇到转换的问题。所以在这篇文章里,我会总结一下导师告诉我的,在网上反复查阅的知识。
c提供了四种转换运算符:
const _ cast new _ type(expression)Static _ cast new _ type(expression)Reinterpret _ cast new _ type(expression)Dynamic _ cast new _ type(expression)它们结构相同,看起来像模板方法。这些方法是为开发人员提供的,用于转换指针和引用。
其实我早就想写这篇文章了。我不停地查导师发来的资料,看网上的相关知识,却始终不能完全理解C转换运算符的用法。相反,在阅读了这些信息后,我写了一篇关于传统转换的文章。虽然从字面上很容易理解它们的一般功能,但真的就像在使用它们一样,只是你不知道它们的具体用途,只会不断被编译器提醒错误。所以如有误解或错误,希望前辈或新人指正。
在我看来,这些标准运算符的作用是取代传统运算符,以实现统一。就像我们用std:endl输出换行符而不是 \n 。我将用代码来解释相应的传统转换如何可以是这些标准操作符。当然,这是一般的理解。在标准运算符上,编译器肯定做了更多的处理,尤其是dynamic_cast不能完全用传统的转换来实现。
在这篇文章中,我首先谈谈我对const_cast运算符的理解。
Const _ cast(expression)const _ cast转换器是一个用于移除变量的const或volatile限定符。后者我不太清楚,因为涉及到多线程设计,我对此一无所知。所以我只说const。
使用const_cast删除const限定。对于const变量,我们不能修改它的值,这是这个限定词最直接的表达。但是如果我们只是想违反它的限制,修改它的内容呢?
下面这段代码显然达不到目的:const int constant=10
int修饰符=常量;
因为modifier的修改不会影响const,这意味着const_cast转换器不应该用于对象数据,因为通过这种转换获得的两个变量/对象没有相关性。
只有用指针或者引用让变量指向同一个地址才是解决办法。可惜下面的代码不能用C编译:const int constant=21
int* modifier=常数
//错误:从“const int*”到“int*”的转换无效
(以上代码可以用C编译,最多会得到一个警告。如果你是C,就可以开始用常量里的数据胡作非为了。)
也不可能给非常数引用一个常量。const int constant=21
int修饰符=常量;
//错误:从“const int”类型的表达式中初始化“int”类型的引用无效
于是const_cast为了引起程序界的混乱,出来破坏const。
以下代码编译成功:const int constant=21
const int* const_p=常量;
int * modifier=const _ cast int *(const _ p);
*修饰符=7;
实现const_cast算子的传统变换。我说准变换算子可以用传统变换实现。之所以实现const_cast,是因为C对指针的转换是任意的,它不检查类型,任何指针都可以相互转换。所以const_cast可以直接用显示转换(int*)代替:const int constant=21
const int* const_p=常量;
int * modifier=(int *)(const _ p);
或者我们可以把它们合成一个语句,跳过中间变量,用const int constant=21
int* modifier=(int*)(常量);
Replace const int常量=21;
int* modifier=const_cast int*(常量);
为什么要去掉const资格?从前面的代码可以看出,我们不能修改常量,但是可以重新分配修饰符。
但是,程序世界真的很乱吗?我们真的通过modifier修改了constatn的值吗?去const修改const变量的数据真的是C的目的吗?
如果我们打印出结果:cout constant: constant endl;
cout const _ p: * const _ p endl;
“cout”修饰符:“*修饰符endl
/**
常数:21
const_p: 7
修改器:7
**/
常数仍然保持其原始值。
但它们指向同一个地址:
cout constant: constant endl;
cout const _ p: const _ p endl;
cout 修饰符: 修饰符endl
/**
常数:0x7fff5fbff72c
const_p:0x7fff5fbff72c
修饰符:0x7fff5fbff72c
**/
这真的是一件很奇怪的事情,但却是一件好事:意思是const在C中,也就是const,外界千变万化,我就不改了。否则真的会乱,const也就没有存在的意义了。
IBM的C指南叫做“* modifier=7;”是“未定义的行为”。Undefined表示在标准C中没有指定这个语句,编译器决定如何处理它。
左移位运算也可以看作是一种未定义的行为,因为我们不确定是逻辑左移还是算术左移。
比如下面这个语句:v[I]=I;这也是一种未定义的行为,因为我们不知道是先做自增还是先找到数组中的位置。
对于未定义的行为,我们能做的就是避免这样的语句。对于const数据,我们应该确保它永远不会被重新赋值。
如果我们不想修改const变量的值,那么我们为什么要去const呢?
原因是我们可能调用了一个参数不是const的函数,而我们要传入的实际参数确实是const,但是我们知道这个函数不会修改参数。所以我们需要用const_cast去掉const限定,这样函数才能接受这个实参。
#包括iostream
使用命名空间std
void Printer (int* val,string seperator= \ n )
cout val分离器;
int main(void)
const int consatant=20
//打印机(consatant);//错误:从“int”到“int*”的转换无效
printer(const _ cast int *(consatant));
返回0;
}出现这种情况的原因可能是我们调用的方法是别人写的。我能想到的另一个原因是当const对象要调用自己的非const方法时出现,因为在类定义中,const也可以作为函数重载的指示器。当我有机会的时候,我会复习我所知道的const的用法。关于c中的const,真的有太多要说的了。
在IBM的C指南中,还有一种情况可能需要去const:
#包括iostream
使用命名空间std
int main(void) {
int变量=21;
int* const_p=变量;
int * modifier=const _ cast int *(const _ p);
*修饰符=7
“cout”变量:“变量endl
返回0;
变量:7
* */我们定义了一个不是const的变量,但是用一个const限定的指针指向它。在某些时候,我们突然想再次修改它,但我们只有指针。这时候我们可以去const修改一下。上面的代码结果也证实了我们已经成功地修改了它。
不过我觉得这并不是一个好的设计,但是要遵循一个原则,使用const_cast移除const资格的目的绝对不是修改其内容,只是出于无奈。(如果真的像我说的那么无奈的话,似乎const_cast并不是很有用,但确实我很少用。)
导演:Jim FawcettC语言教程-类型强制转换面向对象设计IBM编译器-XL C/C v 9.0 for Linux-const _ cast运算符(仅限C)stack overflow:const _ cast安全吗?
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。