码迷,mamicode.com
首页 > 其他好文 > 详细

重载和引用函数

时间:2014-05-22 15:38:41      阅读:374      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   code   java   

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

如下:

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

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

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

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

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

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

程序执行结果如下:

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

 

重载和引用函数,布布扣,bubuko.com

重载和引用函数

标签:style   blog   class   c   code   java   

原文地址:http://www.cnblogs.com/wuchanming/p/3744090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!