首页 > 编程语言 >C++11的类型转换

C++11的类型转换

时间:2024-02-27 21:23:06浏览次数:23  
标签:11 类型转换 const int C++ C语言 cast 隐式

//C类型转换 /* C语言:显式和隐式类型转换 1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 2. 显式类型转化:需要用户自己处理. 隐式类型:界定:相关类型,相近类型,意义相似的类型 可以发生类型转换 , 如整型和浮点可以发生类型转换,因为他们都表示数据的大小. 指针和整型不能发生,因为指针表示地址,和整型的意义不一样. 缺陷: 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换 C语言的隐式类型转换的坑; size_t 和 int (无符号和有符号):在vector 的 insert中体现 . 如size_t与int的变量有比较操作时会发生类型提升。当其中一个将要<0就会难以控制 */ //C++为什么需要强制类型转换 /* C++认为隐私类型转换不够好,最好就是不让隐私类型转换发生,于是引入了强制类型转换 C风格的转换格式很简单,但是有不少缺点的: 1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失 2. 显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的 转化风格 */ //C++强制类型转换 /* 标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符: static_cast、reinterpret_cast、const_cast、dynamic_cast 1.static_cast static_cast 对应 C语言的隐式类型转换(能当C语言的隐式类型转换使用) 用于非多态类型的转换(静态转换).编译器隐式执行的任何类型都可用. 但是不能用于两个不相关的类型进行转换 int main() { double d = 12.34; int a = static_cast(d); // 意义相似,可以静态转换 ,仅丢失精度 std::cout << a << std::endl; return 0; } 2.reinterpret_cast -- 重新解释的转换 , 对应C语言的显式强制类型转换 reinterpret_cast 是重新解释的意思,进行一些不相关类型的转换 通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型. 相关或相近类型不能使用reinterpret_cast.(会报错) int main() { double d = 12.34; int a = static_cast(d); std::cout << a << std::endl; // 这里使用static_cast会报错,应该使用reinterpret_cast //int *p = static_cast<int*>(a); int* p = reinterpret_cast<int*>(a); //如C语言的强制类型转换,把int转化成int* return 0; } 3.const_cast --- 去掉const的转换 const_cast最常用的用途就是删除变量的const属性,方便赋值. 通常要搭配volatile使用,因为编译器可能会把const变量当作宏来直接替换 或当作不再修改的变量放到寄存器. ( C语言通过指针进行强转是可以去掉const的 -- 不够规范) int main() { volatile const int a = 2; //int *p = (int*) &a; int* p = const_cast<int*>(&a); *p = 3; std::cout << a << std::endl; std::cout << *p << std::endl; return 0 ; } 4.dynamic_cast ---- 动态转换 多态知识: 赋值兼容规则 1.派生类的对象可以赋值给基类对象。 2.派生类的对象可以初始化基类的引用。 3.派生类对象的地址可以赋给指向基类的指针。 一般情况下,类型转换只支持指针和引用,对象不支持 父类是上,子类是下 赋值兼容规则天然支持 对象/指针/引用 下转上(子类转父类:切片) 即 "向上转型" dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换) 1. dynamic_cast只能用于父类含有虚函数的类 2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0 dynamic_cast: 安全的向下转型. 为什么安全? 向下转型只支持指针和引用 C语言强制向下转型是不安全的. 为什么? // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr // 成功是指子类转子类. 失败是指子类转父类(越界) 因此,强转后只需要判断是否为空再使用,就能够保证安全 */ // RTTI /* RTTI:Run - time Type identification的简称,即:运行时类型识别。 C++通过以下方式来支持RTTI: 1. typeid运算符 //仅能获取类型的字符串 2. dynamic_cast运算符 //也是类型识别,识别指针是指向父类还是指向子类 3. decltyp */

标签:11,类型转换,const,int,C++,C语言,cast,隐式
From: https://www.cnblogs.com/DSCL-ing/p/18038383

相关文章

  • 【现代C++】2.强化语言运行期的强化
    1.Lambda表达式lambda表达式实际提供了一个类似匿名函数的特性,匿名函数是在需要一个函数,但是又不想费力去命名一个函数的情况下使用的。1.1Lambda表达式基本语法[捕获列表](参数列表)mutable(可选)异常属性->返回类型{//函数体}捕获列表分为以下几种:1.1.1值捕......
  • C++11新特性的一些用法举例①
    //字符串字面量/*常用:1.原始字符串字面量---括号内保持原样输出---没有转义字符,如\n不再是换行,而是直接输出字面量\nR"(str)";实例:R"(aa\a"b"bb)";//print:aa\a"b"bb注意:constchar*s1=R"foo(HelloWorld)foo";打印结果:HelloWorld;----//&qu......
  • C++ STL 容器 list类型
    C++STL容器list类型list对于异常支持很好,要么成功,要么不会发生什么事情以下是std::list在异常处理方面表现良好的几个原因:动态内存管理:std::list使用动态内存分配来存储元素,这意味着它会在需要时自动分配内存,并在不再需要时释放内存。这种自动管理可以减少内存泄漏和悬......
  • P7745 [COCI2011-2012#3] ROBOT
    Description在一个平面直角坐标系中,有一个点bot,现有四个指令,分别可以让bot向上、下、左、右四个方向中的一个移动一格。同时还有\(n\)个固定点,求每次移动后这些点到bot的哈曼顿距离之和。两个点\((x1,y1)\)和\((x2,y2\)的曼哈顿距离为\(|x1-x2|+|y1-y2|\)......
  • cf1153f-solution
    CF1153FSolutionlink题意:有一段长为\(l\)的线段,有\(n\)个实数区间,左右端点在\([0,l)\)间均匀随机。求期望被至少\(k\)段区间覆盖的长度,对\(998244353\)取模。\(1\lek\len\le10^7,1\lel\le10^{10^6}\)首先\(l\)是没用的,我们可以计算线段长为\(1\)时的......
  • cf1148h-solution
    CF1148HSolutionlink对于区间mex,若固定一个右端点\(r\),左端点\(l\)越小mex肯定越大。假设我们维护了右端点为\(n\),左端点为\(i\in[1,n]\)的区间mex(设为\(b_i\)),考虑在序列末尾加入一个数\(x\):显然有且仅有原先\(b_i=x\)的一段\(b\)会被改掉。改成什么呢?大概......
  • cf1184a3-solution
    CF1184A3Solutionlink题意:给你两个长度为\(n\)的小写字符串\(s,t\)和一个\(m\),定义哈希函数\[h(s)=\left(\sum_{i=0}^{n-1}s_ir^i\right)\bmodp\]求构造\((p,r)\)且\(p\gem,r\in[2,p-1]\),使得\(h(s)=h(t)\)。\(n,m\le10^5\)。题目即求一个多项式\(f(x)=\sum_{......
  • cf1188e-solution
    CF1188ESolutionlink考虑\(x_i\)表示最后序列中每个数被操作的次数。显然我们可以假设\(\min\{x_i\}=0\)。仍然显然的是这样子的\(x\)序列与最后得到的序列一一对应,也就是说每个最终序列可以只能由一种\(x\)得到。那么就变成计数合法的\(x\)序列了。考虑\(x_i\)需......
  • C++ STL 容器-Deque
    C++STL容器-Dequestd::deque(双端队列)是C++标准模板库(STL)中的一个容器,它支持在序列的两端快速插入和删除元素。与std::vector和std::list等其他序列容器相比,std::deque在某些特定场景下具有独特的优势。元素的访问和迭代比vector慢,迭代器不是普通的指针。以下是std::deque的一......
  • AT_arc117_c [ARC117C] Tricolor Pyramid 题解
    [ARC117C]TricolorPyramid博客阅读体验(也许)更佳题意给一个金字塔的底部颜色组成和生长规律,问顶部的颜色是什么。分析试几次就可以很容易得到的一种构造:令颜色B为\(0\),W为\(1\),R为\(2\)。设左右两个方块的颜色分别为\(col_l\)和\(col_r\),则生长规则可以描......