c++ 运算符,c语言字符怎么转换成运算符

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: