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

news/2024/8/22 16:36:29

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;
}


http://lihuaxi.xjx100.cn/news/1892401.html

相关文章

CSDN一键注释功能

这是什么牛逼哄哄的功能 看这里&#xff1a; 然后&#xff1a; 再试一个&#xff1a; 输出结果是&#xff1f;package yuyi03.interview;/*** ClassName: InterviewTest2* Package: yuyi03.interview* Description:** Author 雨翼轻尘* Create 2023/12/14 0014 0:08*/ publ…

智能守护,数据安全稳中求胜!上海迅软DSE助力家具家电行业引领潮流!

随着中国经济的蓬勃发展&#xff0c;家具家电企业正迎来“精品制造”的时代&#xff0c;业内竞争日益激烈。为了提升产品竞争力、扩大市场占有率&#xff0c;企业亟需加强对自主品牌的安全建设&#xff0c;确保品牌的自主知识产权、产品生产资料以及销售信息等核心数据不受泄漏…

IP与子网掩码之间的关系

子网掩码用于确认IP所在的网段&#xff0c;网络位与子网掩码相匹配 如果有另一台主机想要与这个IP地址进行通信&#xff0c;这时需要看两台主机的IP地址是否处于同一网段&#xff0c;处于同一网段才能相互ping通。 那么怎么判断是否处于同一网段呢&#xff1f;我们就看子网掩…

每日一题2023.12.14|LeetCode3.无重复字符的最长子串

leetcode3.无重复字符的最长字串 连接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/ 滑动窗口 找出字符串中不含重复字符的最长子串&#xff0c;由于最长子串是连续的&#xff0c;所以可以利用滑动窗口来做。窗口内的字符都是…

【mysql】ACID靠什么保证的呢?

回答: A 原子性:由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql undo log: 我们在进行数据更新操作的时候,不仅会记录redo log,还会记录undo log,如果因为某些原因导致事务回滚,那么这个时候MySQL就要执行回滚(rollback)操作,利用…

如何通过数据抓取来协助获取商业情报?Python技术人员都知道

现如今这个信息爆炸的时代&#xff0c;获取商业情报对于企业的发展至关重要&#xff0c;我们每个人都很清楚大数据的重要性&#xff0c;有的时候一些关键的数据往往可以力挽狂澜&#xff0c;为我们企业做出最佳选择提供依据。数据抓取作为一种高效、快速、准确的信息收集方法&a…

将创建表字段语句快速转换成golang struct字段

用网页jquery快速生成 本地建立 struct.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>leo-转换</title> <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></s…

Jenkins离线安装部署教程简记

前言 在上一篇文章基于Gitee实现Jenkins自动化部署SpringBoot项目中&#xff0c;我们了解了如何完成基于Jenkins实现自动化部署。 对于某些公司服务器来说&#xff0c;是不可以连接外网的&#xff0c;所以笔者专门整理了一篇文章总结一下&#xff0c;如何基于内网直接部署Jen…