c11 override声明,函数饰词的用法

本文详细解释了C++中`override`关键字在重写基类虚函数时的重要性,以及如何通过函数饰词控制左值和右值的行为,强调了移动构造在避免无谓拷贝方面的优势。
摘要由CSDN通过智能技术生成

1.override 声明词

无论何时,只要你在派生类中声明了一个函数,而且该函数意在改写基类中的一个虚函数时,请确保你给该函数加上此关键字。

如果函数加上此关键字,则编译发现虚派发时的语法错误会报错提示。

class base
{
public:
	base(int name) :base_name(name) {}

	int base_name;
	virtual void fun()const 
    { 
        std::cout << "base fun"; 
    }

};
class wigit //:public base
{
public:

public:
	wigit()=default;
	wigit(const wigit&&wigit_copy )
	{
		this->wigit_name = wigit_copy.wigit_name;
		this->m_vec = wigit_copy.m_vec;
	}

	void fun()const override
	{
		//wigit_name = 0;
		std::cout << "wigit fun";
	}

};

2.函数饰词的用法和一些功能

base& returnvec()&  //以*this为左值时调用此重载函数
    {
        return m_b;
    }

base returnvec()&&  //以*this为右值时调用此重载函数
    {
        return m_b;
    }

注意,饰词也会影响函数的重载

如果使用如下测试代码:auto res = wig.returnvec();则左值对左值,将函数返回的左值赋值给res.

如果使用auto res = wigit::create().returnvec();,则右值对左值,如果没有右值饰词的重载函数,returnvec 函数将被调动的是这个:

base& returnvec()
    {
        return m_b;
    }

,将会将右值对象再进行拷贝一个左值对象返回。其实这个拷贝是多余的,我们完全可以用创建wigit实例函数返回的右值,调动右值饰词,移动构造地来返回资源,(右值饰词返回的右值被用来做base移动构造函数的形参,优先调动移动构造从而不需要额外的拷贝)

class base
{
public:
	base(int name) :base_name(name) {}
	base(const base& base_copy)
	{
		std::cout << "base copy construct";
	}

	base (const base &&base_move)
	{
		std::cout << "base move construct";
		this->base_name = base_move.base_name;
	}


};
class wigit 
{
public:
	static wigit create() { return wigit(); }
	int wigit_name{ 100 };
	base m_b{100};
public:
	wigit()=default;
	wigit(const wigit&&wigit_copy )
	{
		this->wigit_name = wigit_copy.wigit_name;
		this->m_vec = wigit_copy.m_vec;
	}

	base& returnvec()
	{
		return m_b;
	}

	base& returnvec()&
	{
		return m_b;
	}

	base returnvec()&& //利用饰词控制返回的左值和右值的型别,
	{					//对*this的左右值类型执行不同的重载函数;
		return std::move(m_b);
	}

};

int main()
{
	wigit wig;
	//auto res = wig.returnvec();
	auto res = wigit::create().returnvec();
	/*
	如果是返回右值的成员参数,则不需要进行无畏的拷贝构造
	(以调动base& returnvec()函数为例,从右值到左值引用会调动base的拷贝构造,)
	,调动base returnvec()&&,从而直接调动base的移动构造,避免了不必要的拷贝。
	*/
	return 0;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值