类型转换有 c 风格的,当然还有 c++风格的。c 风格的转换的格式很简单(TYPE
EXPRESSION),但是 c 风格的类型转换有不少的缺点,有的时候用 c 风格的转换是不合适的,

因为它可以在任意类型之间转换,比如你可以把一个指向 const 对象的指针转换成指向非
const 对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转
换之间的差别是巨大的,但是传统的 c 语言风格的类型转换没有区分这些。还有一个缺点就
是,c 风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在 c++程
序里一大堆。所以 c++为了克服这些缺点,引进了 4 新的类型转换操作符。

.1.静态类型转换:
 语法格式:
      static_cast<目标类型> (标识符)
 转化规则:
                在一个方向上可以作隐式转换,在另外一个方向上就可以作静态转换。
  int a = 10;
  int b = 3;
  cout<<static_cast<float>(a)/b<<endl; //float = int int = float
  return 0;

int *p; void *q;
  p = static_cast<int*>(q);
  char *p = static_cast<char*>(malloc(100));

.2.重解释类型转换:
 语法格式:
               reinterpret_cast<目标类型> (标识符)
 转化规则
            “通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式
的重新解释,在双方向上都不可以隐式类型转换的,则需要重解释类型转换。

    float a = 5.6;
int b = 5; b = static_cast<int>(a);
a = static_cast<float>(b); void *p;int *q;
p = q;
//q = p ;这样就不可以
q = static_cast<int*>(p); int x = 10;
int y = 3;
float z = static_cast<float>(x)/y;
cout<<z<<endl; //char * pc = malloc(100);编译通不过
char *pc = static_cast<char *>(malloc(100)); return 0;

  .3.()常类型转换:
 语法格式:
const_cast<目标类型> (标识符) //目标类类型只能是指针或引用
语法规则
用来移除对象的常量性(cast away the constness)使用 const_cast 去除 const 限定的
目的不是为了修改它的内容,使用 const_cast 去除 const 限定,通常是为了函数能够接受
这个实际参数。
应用场景 1:

#include <iostream>
using namespace std;
void func(int & ref) //别人己经写好的程序或类库
{
cout<<ref<<endl;
}
int main(void)
{
const int m = 4444;
func(const_cast<int&>(m));
return 0;
}
//脱掉 const 后的引用或指针可以改吗?
int main()
{
const int x = 200;
int & a =const_cast<int&>(x); // int &a = x;
a = 300;
cout<<a<<x<<endl;
cout<<&a<<"---"<<&x<<endl;
int *p =const_cast<int*>(&x); // int *p = &x;
*p = 400;
cout<<a<<*p<<endl;
cout<<p<<"---"<<&x<<endl; struct A
{
int data;
}; const A xx = {1111};
A &a1 = const_cast< A&>(xx);
a1.data = 222;
cout<<a1.data<<xx.data<<endl;
A *p1 = const_cast<A*>(&xx);
p1->data = 333;
cout<<p1->data<<xx.data<<endl;
return 0;
}

  

结论:
可以改变 const 自定义类的成员变量,但是对于内置数据类型,却表现未定义行为.
Depending on the type of the referenced object, a write operation throu
gh the resulting pointer, reference, or pointer to data member might pr
oduce undefined behavio

const 常变量(补充):
C++中 const 定义的变量称为常变量。变量的形式,常量的作用,用作常量,常用于
取代#define 宏常量。

#define N 200
int main()
{
const int a = 200;
int b = 300;
int c = a +b; //int c = N + b;
cout<<c<<endl;
return 0;
}

  

类型强转(type cast)的更多相关文章

  1. java中Number Type Casting(数字类型强转)的用法

    4.5 Number Type Casting(数字类型强转)隐式 casting(from small to big) byte a = 111; int b = a;显式 casting(from ...

  2. c++类型转换Type Cast)

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast, ...

  3. 2d-x中Lua类型强转问题

    在Lua中,使用CCDictionary进行保存CCSprite对象,但是,在CCDictionary取出来的时候,此时是一个CCObject对象,无法调用子类精灵的一些方法.那只能进行强转的. 那么 ...

  4. scala如何解决类型强转问题

    scala如何解决类型强转问题 scala属于强类型语言,在指定变量类型时必须确定数据类型,即便scala拥有引以为傲的隐式推到,这某些场合也有些有心无力. 例如: java同属强类型语言,但java ...

  5. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  6. HTTP请求415错误 – 不支持的媒体类型(Unsupported media type)

    HTTP请求415错误 – 不支持的媒体类型(Unsupported media type) 通常有以下情况: 1:检查你的 http 请求头信息,比如 因为 User-Agent 被服务器设置 拒绝 ...

  7. C#中的枚举类型(enum type)

    ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, B ...

  8. C#中的值类型(value type)与引用类型(reference type)的区别

    ylbtech- .NET-Basic:C#中的值类型与引用类型的区别 C#中的值类型(value type)与引用类型(reference type)的区别 1.A,相关概念返回顶部     C#中 ...

  9. 转:有关Java泛型的类型擦除(type erasing)

    转载自:拈花微笑 自从Java 5引入泛型之后,Java与C++对于泛型不同的实现的优劣便一直是饭后的谈资.在我之前的很多training中,当讲到Java泛型时总是会和C++的实现比较,一般得出的结 ...

随机推荐

  1. 7.适配器模式(Adapter Pattern)

    using System; namespace Test { /// <summary> /// 适配器模式主要解决的问题就是我们要调用的接口类型,无法满足我们新系统的使用需求, /// ...

  2. 微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

    sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed ...

  3. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

  4. Mongodb安装(Mac平台)

    1安装: sudo brew install mongodb 2 启动MongoDb sudo mongod —config /usr/local/etc/mongod.conf 3.登录mongo ...

  5. [杂]DeadLock, Isolation Level, EntityFramework

    由于没有注意到EF事务的默认隔离级别是Serializable,(据说EF6.0以后默认隔离级别改成了Read_Commit_Snapshot)--这里有误,应该是加了TransactionScope ...

  6. 对学长所谓“改变世界的游戏”《shield star》的运行感想-毛宇部分(完整版本请参考团队博客)

    对于学长项目<shield star>的思考和看法: Ryan Mao ((毛宇)  110616-11061171 试用了一下学长黄杨等人开发的<shield star>游戏 ...

  7. Oracle多个服务各代表什么作用(转)

    在Windows 操作系统下安装Oracle 9i时会安装很多服务——并且其中一些配置为在Windows 启动时启动.在Oracle 运行在Windows 下时,它会消耗很多资源,并且有些服务可能我们 ...

  8. 用戶登陸。防SQL注入,驗證碼不區分大小寫

    if (string.Compare(TBCheckCode.Text, Session["CheckCodeI"].ToString(), true) == 0)        ...

  9. Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析

    加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链 ...

  10. CountDownLatch、CyclicBarrier、Semaphore、Exchanger

    CountDownLatch: 允许N个线程等待其他线程完成执行.无法进行重复使用,只能用一次. 比如有2个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch ...