effective c++ 16 尽量少做转型动作

尽量少转型动作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
旧式转换仍然可以使用,但推介新式的,因为它更容易辨认。比如以下例子:

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;

	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一种做法是多态:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样的代码应该使用多态替换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值