回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C++之父的FAQ >> C++ 风格与技术 FAQ >> [翻译] static_cast 有什么好处?
最 近 更 新
[转] 我该把const写在类..
[翻译] 我应该使用按值..
[翻译] 你如何命名变量..
[转] 何种代码布局风格..
[转] “int* p;”和“in..
[翻译] “cout”怎么念?
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
最 新 推 荐
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
[翻译] 数组有何不好之..推荐
[转] 为何delete操作不..推荐
[转] 有placement delet..推荐
[翻译] “new”和“mall..推荐
[转] C和C++风格的内存..推荐
[翻译] 为何标准容器效..推荐
热 门 排 行
[转] 我可以写“void ma..
[翻译] 什么是纯虚函数?
[转] 这个简单的程序…..推荐
[转] 我如何从标准输入..
[翻译] i++ + i++ 的值..推荐
[转] 我该把const写在类..
[转] 我怎样才能把整数..
[转] 我应该怎样处理内..推荐
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

[翻译] static_cast 有什么好处?


来源:蚂蚁的 C/C++ 标准编程 作者:Bjarne Stroustrup 翻译:antigloss 等级:精品
发布于2007-09-08 23:47 被读815次 【字体:
转载请注明作者 Bjarne Stroustrup 翻译:antigloss 和出处。好吗?谢谢! 

    总的来说,应该尽量避免类型转换(dynamic_cast 除外)。使用类型转换常常会引起类型错误或者数值截断。甚至于看起来“无辜”的类型转换也有可能变成很严重的问题,如果在开发或者维护期间,其中一个相关的类型改变了的话。例如,下面这个是什么意思:

        x = (T)y;

    我们不得而知。这取决于类型 T 以及 x 和 y 的类型。T 可能是类的名字、typedef 或者模板参数。可能 x 和 y 都是标量变量,而 (T) 代表值的转换。也可能 x 是 y 的派生类的对象,而 (T) 是一个向下转换(downcast)。还可能 x 和 y 是不相关类型的指针。由于 C 风格的类型转换 (T) 可用于表述很多逻辑上不同的操作,所以编译器很难捕捉误用。同样的道理,程序员不可能精确地知道类型转换到底做了什么。有些菜鸟程序员认为这是一个有利条件,但假若他们错误地判断了形势,将会导致许多细微的错误。

    “新风格的类型转换”因此应运而生,它给予了程序员更清晰地表达他们的真实意图的机会,也使得编译器能捕捉到更多错误。例如:

        int a = 7;
        double* p1 = (double*) &a; // ok(但指向的并非 double 类型的对象)
        double* p2 = static_cast<double *>(&a); // 错误
        double* p2 = reinterpret_cast<double *>(&a); // ok:我真的想这么干

        const int c = 7;
        int* q1 = &c; // 错误
        int* q2 = (int*)&c; // ok(但 *q2=2; 仍然是不合法的代码,而且有可能失败)
        int* q3 = static_cast<int *>(&c); // 错误:static_cast 不能去除 const 属性
        int* q4 = const_cast<int *>(&c); // 我的确想这么干

    static_cast 所允许的转换都比需要使用 reinterpret_cast 才能进行的转换更安全,更不易出错。大体上,可以直接使用 static_cast 转换后的值,而无需将其再转换成原来的类型。而由 reinterpret_cast 得到的值却总是应该被转换成原来的类型后才使用,这样才能确保可移植性。

    引入新风格类型转换的第二个原因是,C 风格的类型转换在程序中难以被发现。例如,在普通的编辑器或者文字处理软件里,你不能方便地查找类型转换。C 风格类型转换的这一隐秘性实在是糟透了,因为类型转换潜在着极其高的破坏性。丑陋的操作应该使用丑陋的语法形式。这个事实也是选择新风格类型转换语法的部分依据。更深一层的原因是,让新风格的类型转换语法和模板语法一致,这样程序员就能编写自己的类型转换,尤其是带运行时检查的类型转换。

    或许,因为 static_cast 很难看,而且也相对难拼,所以你更可能会充分考虑后才决定是否使用它?这很好,因为现代 C++ 里,类型转换真的是最容易避免的。

原文地址http://www.research.att.com/~bs/bs_faq2.html#static-cast

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Bjarne Stroustrup 翻译:antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C++ 之父的言论
[转] 我该把const写在类型前面还是后面?
[翻译] 我应该使用按值传递还是按引用传递?

上一篇:[翻译]为何C++里有些东西是未定义的?
下一篇:[转] 宏有什么不好吗?

共有评论 1 条 网友评分 1分 查看全部评论

游客:cls
评分:0
  double* p1 = (double*) &a; // ok(但指向的并非 double 类型的对象)
那指向什么类型?

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss