effective c++ 尽量少做转型动作(2)

原创 2015年11月19日 17:22:32

C风格的转型动作
(T)expression //将expression转型为T
函数风格的转型动作
T(expression)//将expression转型为T

旧式转型依旧合法,但是新式转型较受欢迎
1.容易在代码中识别出来,无论是人眼还是grep等工具
2.各转型目标愈窄化,编译器愈可能诊断出错误的运用,比如只有const_cast能去掉常量性

class Base
{
public:
    void show(){cout << "base" << endl;}
};
class Base2
{
public:
    void show(){cout << "base2" << endl;}
};
class Derived:public Base,public Base2
{
public:
    void show(){cout << "derived" << endl;}
};
Derived d;
Base* pb = &d;
Base2* pb2 = &d;
Derived *pd = &d;
//单一对象(例如一个类型为Derived的对象)可能拥有一个以上的地址
//以Base*指向它时的地址和以Derived*指向它时的地址
//虽然我的电脑没有尝试出来
//但是依旧,应该避免做出“对象在C++中如何布局”的假设
//例如,将对象地址转型为char*指针然后在他们身上进行指针算术
//几乎总是导致无定义行为
class Base
{
public:
    Base():cur(1){}
    virtual void onResize()
    {
        cur = 10;
    }
    int cur;
};
class Derived:public Base
{
public:
    virtual void onResize()
    {
        static_cast<Base>(*this).onResize();
        cout << Base::cur << " cur " << endl;
        //显示cur为1(初始值)
        //因为调用的不是当前对象身上的函数
        //而是转型动作所建立的一个*this对象之base class成分
        //的暂时副本身上的onResize
    }
};
int main()
{
    Derived d;
    d.onResize();
}

结果

class Derived:public Base
{
public:
    virtual void onResize()
    {
        Base::onResize();
        cout << Base::cur << " cur " << endl;
        //这样就对了
    }
};

dynamic_cast主要用来执行“安全向下转型”,也就是用于决定某对象是否归属继承体系中的某个类型。。。
但是可能耗费重大运行成本的转型动作,很多时候可以用virtual代替

优良的C++代码很少使用转型,我们应该尽量隔离转型动作,通常是把它隐藏在某个函数内。函数的接口会保护调用者不受函数内部任何肮脏龌龊的动作影响!

版权声明:http://blog.csdn.net/c337134154

条款27 尽量少做转型动作

隐式转换 在谈及显式转换之前,先简单说说隐式转换。 int ival = 0; ival = 3.541 + 3; //doubl向int转换会丢失精度,编译器会警告:“=”从double到in...
  • u013074465
  • u013074465
  • 2015年06月30日 09:25
  • 943

尽量少做转型动作 《Effective C++》

背景: C++规则的设计目标之一:保证 类型错误 绝不可发生。(非常重要!) 一个程序能干净地通过编译,表示:该程序不会在任何对象身上执行 任何不安全,无意义、愚蠢的操作。 但转型破坏类型系统。可能会...
  • lnkiss
  • lnkiss
  • 2017年12月21日 11:13
  • 32

effective c++尽量少做转型动作(1)

为啥要分两次写呢,因为这篇实在是太长了,因为畏惧他的长度,所以这几天竟然一直拖着没有写effective c++的读书笔记,导致也没有往后面太看。。。所以,以后如果文章太长了,不要惧怕,分开写就好了,...
  • c337134154
  • c337134154
  • 2015年11月15日 00:06
  • 397

C++之尽量少做转型动作(27)---《Effective C++》

条款27:尽量少做转型动作C++的设计目标之一就是保证“类型错误”绝不可能发生,与此目标直接冲撞的是转型操作,不论是C++中继承C部分的转型操作还是C++中所特有的4种类型转换操作,这4中类型转换操作...
  • u014038273
  • u014038273
  • 2017年07月26日 18:04
  • 135

读书笔记《Effective C++》条款27:尽量少做转型动作

C语言风格的转型动作有两种形式: (T)expression //将expression转型为T T(expression) //将expression转型为T两种形式并不...
  • u014558668
  • u014558668
  • 2017年05月20日 22:20
  • 87

《Effective C++》学习笔记条款27 尽量少做转型动作

尽量少做转型动作
  • A09211008
  • A09211008
  • 2013年12月31日 09:11
  • 911

Effective C++:条款27:尽量少做转型动作

(一)C风格旧式转型: (T)expression T(expression) (二)C++提供四种新式转型: (1)const_cast(expression):去除表达式的...
  • u010470972
  • u010470972
  • 2014年06月23日 20:19
  • 647

item27:尽量少做转型动作

本篇文章引用cai
  • honghui91
  • honghui91
  • 2014年07月23日 16:55
  • 238

《Effective C++》条款27:尽量少做转型动作

C++中的四种新式转型: const_cast:常量性转除 dynamic_cast:用来决定某对象是否归属继承体系中的某个类型 reinterpret_cast:低级转型,如将pointer ...
  • applemonkey11
  • applemonkey11
  • 2018年01月16日 11:36
  • 13

C++编程习惯:尽量少做转型动作

C++规则的设计目标之一是,保证“类型错误”绝不可能发生。理论上如果你的程序”很干净“通过编译,就表示它并不企图在任何对象身上执行任何不安全、无意义、愚蠢荒谬的操作。这是一个极具价值的保证,可别草率地...
  • Feisy
  • Feisy
  • 2008年05月01日 03:26
  • 634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective c++ 尽量少做转型动作(2)
举报原因:
原因补充:

(最多只允许输入30个字)