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

2023-12-14 23:52

本文主要是介绍c11 override声明,函数饰词的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于c11 override声明,函数饰词的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/494349

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Mysql中isnull,ifnull,nullif的用法及语义详解

《Mysql中isnull,ifnull,nullif的用法及语义详解》MySQL中ISNULL判断表达式是否为NULL,IFNULL替换NULL值为指定值,NULLIF在表达式相等时返回NULL,用... 目录mysql中isnull,ifnull,nullif的用法1. ISNULL(expr) → 判