首页 > 编程语言 >C++11:引用限定符

C++11:引用限定符

时间:2023-01-01 09:44:40浏览次数:44  
标签:11 const 函数 右值 int demo C++ num 限定符

C++中有左值和右值的概念。其实,左值和右值的区分也同样适用于类对象,本文中将左值的类对象称为左值对象,将右值的类对象称为右值对象。

1. C++11:引用限定符

默认情况下,对于类中用 public 修饰的成员函数,既可以被左值对象调用,也可以被右值对象调用。举个例子:

#include <iostream>
using namespace std;

class demo {
public:
    demo(int num):num(num){}
    int get_num(){
        return this->num;
    }
private:
    int num;
};

int main() {
    demo a(10);
    cout << a.get_num() << endl;
    cout << move(a).get_num() << endl;
    return 0;
}

可以看到,demo 类中的 get_num() 成员函数既可以被 a 左值对象调用,也可以被 move(a) 生成的右值 demo 对象调用,运行程序会输出两个 10。

某些场景中,我们可能需要限制调用成员函数的对象的类型(左值还是右值),为此 C++11 新添加了引用限定符。所谓引用限定符,就是在成员函数的后面添加 "&" 或者 "&&",从而限制调用者的类型(左值还是右值)。
修改上面程序如下:

#include <iostream>
using namespace std;

class demo {
public:
    demo(int num):num(num){}
    int get_num()&{
        return this->num;
    }
private:
    int num;
};

int main() {
    demo a(10);
    cout << a.get_num() << endl;          // 正确
    //cout << move(a).get_num() << endl;  // 错误
    return 0;
}

和之前的程序相比,我们仅在 get_num() 成员函数的后面添加了 "&",它可以限定调用该函数的对象必须是左值对象。因此第 17 行代码中,move(a) 生成的右值对象是不允许调用 get_num() 函数的。
同理,我们再次修改程序:

#include <iostream>
using namespace std;

class demo {
public:
    demo(int num):num(num){}
    int get_num()&&{
        return this->num;
    }
private:
    int num;
};

int main() {
    demo a(10);
    //cout << a.get_num() << endl;      // 错误
    cout << move(a).get_num() << endl;  // 正确
    return 0;
}

和先前程序不同的是,get_num() 函数后根有 "&&" 限定符,它可以限定调用该函数的对象必须是一个右值对象。

注意:引用限定符不适用于静态成员函数和友元函数。

2. const和引用限定符

我们知道,const 也可以用于修饰类的成员函数,我们习惯称为常成员函数,例如:

class demo{
public:
    int get_num() const;
}

这里的 get_num() 就是一个常成员函数。const 和引用限定符修饰类的成员函数时,都位于函数的末尾。C++11 标准规定,当引用限定符和 const 修饰同一个类的成员函数时,const 必须位于引用限定符前面。
需要注意的一点是,当 const && 修饰类的成员函数时,调用它的对象只能是右值对象;当 const & 修饰类的成员函数时,调用它的对象既可以是左值对象,也可以是右值对象。无论是 const && 还是 const & 限定的成员函数,内部都不允许对当前对象做修改操作。

举个例子:

#include <iostream>
using namespace std;

class demo {
public:
    demo(int num,int num2) :num(num),num2(num2) {}
    //左值和右值对象都可以调用
    int get_num() const &{
        return this->num;
    }
    //仅供右值对象调用
    int get_num2() const && {
        return this->num2;
    }
private:
    int num;
    int num2;
};

int main() {
    demo a(10,20);
    cout << a.get_num() << endl;        // 正确
    cout << move(a).get_num() << endl;  // 正确
   
    //cout << a.get_num2() << endl;     // 错误 
    cout << move(a).get_num2() << endl; // 正确
    return 0;
}

标签:11,const,函数,右值,int,demo,C++,num,限定符
From: https://www.cnblogs.com/crossoverpptx/p/17017737.html

相关文章

  • ISO C++ forbids taking the address of an unqualified or parenthesized non-static
    //model/util.h#pragmaonce#ifndef__util_h__#define__util_h__#include<chrono>#include<ctime>#include<fstream>#include<iomanip>#include<iostream>......
  • 计挑-国赛-C++-5题
    这跟前面做的蓝桥杯省赛-积木画一个类型,但是递推更简单些凭什么,同样是第五题,这跟Java那边都不是一个难度的#include<iostream>#include<vector>usingnamespacestd;......
  • 投入上百人、经历多次双 11,Flink 已经足够强大了吗?
    作者|Tina作为最活跃的大数据项目之一,Flink进入Apache软件基金会顶级项目已经有八年了。ApacheFlink是一款实时大数据分析引擎,同时支持流批执行模式,并与Hadoop生态可......
  • vscode 上创建 c/c++ 工程
    以win10x64系统为例:首先下载并安装vscode和mingw,其中这个mingw的原版编译器是个在线安装包,由于网络被墙安装会非常慢,甚至经常会出现安装中途失败的情况,因此我将以往......
  • 第119篇: JavaScript 类
    好家伙,我们先来复习一下 关于Java,类的三大特征:1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏......
  • 漫谈C++内存和OpenGL各种缓冲对象(上)
    1、C++内存管理(1)常用数据类型占用内存大小:char1字节;int4字节;short2字节;long4字节;bool1字节;float4字节;double8字节;(2)堆栈的比较 [1]堆用于动态分配内存,容量大于......
  • day12-功能实现11
    家居网购项目实现011以下皆为部分代码,详见https://github.com/liyuelian/furniture_mall.git27.功能25-事务管理27.1下订单问题思考在生成订单的功能中,系统会去同时......
  • Allure11-总结
    allure特性非动态特性@allure.epic、@allure.feature、@allure.story、@[email protected]、@[email protected][email protected]......
  • debian11用iso制作本地apt源
    摘抄记录,原文链接:https://blog.csdn.net/leejearl/article/details/122708953?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Ed......
  • Unified tutorial for dynamic and static compilation of Qt projects for C++
    EnvironmentinstallationRequirementsdownloadRequirementsLinksQt5.7dynamiccompilerqt-opensource-windows-x86-msvc2015-5.7.1CompiledQt5.......