C++primer学习:重载运算符(3)

为StrBlobPtr编写解引用运算符*和箭头运算符.注意箭头运算符只能返回一个指针或者一个重载了箭头运算符的对象.

string& operator*()const  { auto p = check(curr, "deference past end"); return (*p)[curr]; }//返回所指string的引用
    string* operator->()const { return &operator*(); }//返回一个指针

定义一个指向StrBlobPtr的类,并编写新的-〉符号

class ToStrBlobPtr
{
public:
    StrBlobPtr& operator*(){ 
        if(Sp) return *Sp;//如果指向某个StrBlobPtr,返回它
        else    return StrBlobPtr();//返回一个空的StrBlobPtr
     }
    StrBlobPtr* operator->(){    return &operator*(); }
private: 
    StrBlobPtr* Sp;
};

===========================================

函数调用运算符(),让我们可以像使用函数一样使用该类的对象.

[练习]:定义一个函数对象类,接受三个参数,首先检查第一个形参,如果成功返回第二个,否则返回第三个.

class If_Else
{
public:
    size_t operator() (size_t i, size_t j, size_t k){
        return i ? j : k;
    }
};

编写一个类检查某个值是否等于给定值,并利用它替换某个序列中所有给定值.

class Is_Equal
{
public:
    Is_Equal(int n = 0) :value(n){}
    bool operator()( const int &a)const{ return a == value;}
private:
    int value;
};
int main()
{
    const Is_Equal test(10);
    vector<int> vec(100);
    iota(vec.begin(), vec.end(), 1);
    vec.resize(120, 10);
    replace_if(vec.begin(), vec.end(), test,0);
    for_each(vec.begin(), vec.end(), [](int x){cout<<x<<" "; });
    return 0;
}

利用标准库函数对象与函数适配器(bind绑定)定义一条表达式令其将所有值乘2;

    transform(vec.begin(), vec.end(),vec.begin(),bind(multiplies<int>(), _1, 2));

利用标准库函数对象判断一个给定的int是否被所有int容器的元素整除.

modulus<int> T;
    vector<int>vec{ 1, 2, 3, 4, 5 };
    int n = 1;
    auto test = all_of(vec.begin(), vec.end(), [&](int x){return !T(x,n); });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值