尽量少转型动作
旧式转换仍然可以使用,但推介新式的,因为它更容易辨认。比如以下例子:
class Test{
public:
explicit Test(int x)
{
a = x;
}
void show()
{
cout << a << endl;
private:
int a{ 0 };
};
Test t;
t = Test(21);//如果就看这一句代码,你能看出这是转型???反正我看不出,难道不是调用构造函数啊??
t = static_cast<Test>(21);//但是这一句我就能一眼知道是转型
请看例子,我们很多时候会写出似是而非的代码,感觉好像没什么错,其实隐藏着碗大的bug。
class Test{
public:
explicit Test(int x)
{
a = x;
}
Test() = default;
void show()
{
cout << a << endl;
}
void changea()
{
a = 10000;
}
private:
int a{ 0 };
};
class TestB :public Test
{
public:
TestB(int x, int y) :Test(x)
{
b = y;
}
void show()
{
Test *temp = &static_cast<Test>(*this);
temp->show();
cout << b << endl;
}
private:
int b{ 0 };
};
在类TestB中show(),将本类*this对象转化为Test,哥懂你的意思:你不就想调用本类中包含基类的函数嘛,然后打印。请先看结果:
TestB tb(10,20);
tb.show();
结果:
啊,可以看出这个结果是我们想要的,你很高兴,感觉自己调用对了。但。。。。。。请继续看:将show()修改为:
void show()
{
Test *temp = &static_cast<Test>(*this);
cout << "strong:";
temp->show();
Test::changea();
cout << "this:";
Test::show();
cout << "strongRePrint:";
temp->show();
cout << b << endl;
}
结果:
傻了吧!!!其实这里做了转型,最后调用的是*this对象基类部分的副本。那这样就会存在一个bug(自己分析代码吧懒得解释)。
解决之道就是拿掉转型。如下
void show()
{
Test::show();
cout << b << endl;
}
另一种做法是多态:
这样的代码应该使用多态替换。