重载和引用函数

简介: 对于&限定的函数,我们只能将它用于左值;对于&&限定的函数,只能用于右值; 如下: Foo &retFoo(); //返回一个引用;retFoo 调用是一个左值 Foo retVal(); //返回一个值;retVal 调用是一个右值 Foo i,j; /...

对于&限定的函数,我们只能将它用于左值;对于&&限定的函数,只能用于右值;

如下:

Foo &retFoo();  //返回一个引用;retFoo 调用是一个左值
Foo retVal();     //返回一个值;retVal 调用是一个右值
Foo i,j;            // i和j是左值
i=j;                 //正确:i是左值
retFoo()=j;      //正确:retFoo() 返回一个左值
retVal()=j;       //错误,retVal() 返回一个右值
i=retVal();      //正确,我们可以将一个右值作为赋值操作的右侧运算对象 

下面一个例子来说明可以使用引用限定符&来进行重载:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Foo
{
    public:
        Foo sorted() &&;
        Foo sorted() const &;
        void print();
        Foo(vector<int> vec)
        {
            data=vec;
        }
        Foo()=default;
    private:
        vector<int> data;
};
Foo Foo::sorted() &&
{
    sort(data.begin(),data.end());
    return *this;
}
Foo Foo::sorted() const &
{
    Foo ret(*this);
    sort(ret.data.begin(),ret.data.end());
    return ret;
}
void Foo::print()
{
    for(auto vec:data)
        cout<<vec<<endl;
}
int main()
{
    Foo foo({2,34,32,56,6,45,1});
    foo.print();
    foo.sorted();
    ((foo.sorted()).sorted()).print();
    foo.print();
    return 0;
}

编译器会根据调用sorted的对象的左值/右值属性来确定使用哪个sorted版本:

retVal().sorted();     //retVal()是一个右值,调用Foo::sorted() &&
retFoo().sorted();    //retFoo() 是一个左值,调用Foo::sorted() const &

当我们定义const成员函数时,可以定义两个版本,唯一的区别是一个版本有const限定而另一个没有。引用限定的函数则不一样。如果我们定义两个或两个以上具有相同名字核相同参数列表的成员函数,就必须对所有的函数都加上引用限定符,或者都不加。

程序执行结果如下:

[root@localhost 未命名文件夹]# ./Foo 
2
34
32
56
6
45
1
1
2
6
32
34
45
56
2
34
32
56
6
45
1

 

相关文章
|
11天前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
135 1
|
2月前
|
安全 编译器 C语言
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
21 1
|
7月前
|
存储 编译器 C语言
【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……
【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……
65 0
|
10月前
我应该使用按值调用还是按引用调用?
我应该使用按值调用还是按引用调用?
|
7月前
函数的重载
函数的重载
19 0
定义了一个类A,S是类外的一个函数,通过A.S=S进行赋值
假设类 A 已经定义好了,现在可以通过 A.S = S 的方式将函数 S 赋值给类 A。这样做的效果是,将 S 函数作为类 A 的一个属性,并且可以通过该属性来调用函数 S。 下面是一个简单的例子:
函数参数的声明及调用
函数参数的声明及调用
121 0
函数参数的声明及调用
|
安全 编译器 C++
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二)
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 "初学者" 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 "一键三连" 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ω・)ノ
74 0
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二)
|
编译器 C++
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一)
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 "初学者" 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 "一键三连" 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ω・)ノ
103 0
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一)
|
C语言 C++
C++ 构造函数+析构函数+函数参数的传递
C++ 构造函数+析构函数+函数参数的传递
103 0
C++ 构造函数+析构函数+函数参数的传递

热门文章

最新文章