函数调用运算符

14.34定义一个函数对象类,令其执行if-then-else的操作;该类型的调用运算符接受三个参数,它首先检查第一个形参,如果成功返回第二个参数的值;如果不成功返回第三个形参的值。

#include<iostream>
using namespace std;
class if_then_else
{
public:
    int operator()(int a,int b,int c) const
    {
        if(a)
            return b;
        else
            return c;
    }
};

int main()
{
    if_then_else f;
    cout<<f(3,4,5)<<endl;
    return 0;
}

14.35 编写PrintString的类,令其从istream中读取一行输入,然后返回一个表示我们所读内容的string。如果读取失败,返回空string。

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

class PrintString
{
public:
    PrintString(ostream &o=cout,char c=‘ ‘):os(o),sep(c) {}
    void operator()(const string &s) { os<<s<<sep;}
private:
    ostream &os;
    char sep;
};

int main()
{
    string str;
    PrintString p;
    if(getline(cin,str))
        p(str);
    else
        p(string());
    return 0;
}

14.36 使用上面定义的类读取标准输入,将每一行保存在vector的一个元素。

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

class PrintString
{
public:
    PrintString(ostream &o=cout,istream &i=cin,char c=‘ ‘):os(o),is(i),sep(c) {}
    void operator()(const string &s) { os<<s<<sep;}
    istream& operator()(string &s) { getline(is,s); return is;}
private:
    ostream &os;
    istream &is;
    char sep;
};

int main()
{
    vector<string> vec;
    string str;
    PrintString p;
    while(p(str))//输入
        vec.push_back(str);
    for(const auto  v:vec)
        p(v);//输出
    /*if(getline(cin,str))
        p(str);
    else
        p(string());*/
    return 0;
}

14.37编写一个类令其检查两个值是否相等。使用该对象及标准库算法编写程序,令其替换某个序列中具有给定值的所有实例。

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

class replaces
{
public:
    replaces(string s1="old",string s2="new"):oldval(s1),newval(s2) {}
    void operator()(string &s){ if(s==oldval) s=newval;}
private:
    string oldval;
    string newval;
};

int main()
{
    vector<string> vec={"old","a","old","b","old"};
    for_each(vec.begin(),vec.end(),replaces());
    for(auto v:vec)
        cout<<v<<" ";
    cout<<endl;
    return 0;
}
时间: 2024-11-11 20:07:04

函数调用运算符的相关文章

函数调用运算符重载

如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象.因为这样的类同时也能存储状态,所以与普通函数相比它们更加灵活. 例如: struct absInt{ int operator()(int val) const{ return val<0?-val:val; } } 这个类只定义了一种操作:函数调用运算符,它负责介接受一个int类型的实参,然后返回该实参的绝对值. 我们使用调用运算符的方式是令一个absInt对象作用于一个实参列表,这一过程看起来非常像调用函数的过程: int

c/c++ 重载运算符 函数调用运算符

重载运算符 函数调用运算符 把一个类的对象a,当成函数来使用,比如a(),所以需要重载operator()方法.重载了函数调用运算符的类的对象,就是函数对象了. 还有什么是函数对象呢??? lambda是函数对象 std::bind函数的返回值是函数对象 函数是函数对象 函数指针是函数对象 那函数对象是做什么用的呢??? 在标准算法中使用,比如std::(b, e, 函数对象); 标准库提供了下面的函数对象,它们都是模板形式的,它们放在functional头文件中 算术 关系 逻辑 plus<T

对下标运算符[]和函数调用运算符()的重载

一.对下标运算符[]的重载: 重载的格式:返回类型 类名 operator [](参数): #include<iostream> using namespace std; class A { public: A(int n); ~A(); int & operator [](int n);//返回类型为int & 引用类型 private: int *p; int size; }; int & A::operator[](int n){ return p[n];//返回

程序语言理解 ,学习C++ primer 第5版 函数调用运算符 P506

理解: 方法用()调用. 要更抽象的看,方法就是个变量名,“()”是调用方法的简单表述(也要为了让编译器识别),调用方法是操作的结果. eg: a = 1;    a是个变量名, “=” 是赋值的简单表述(只是我们已经接触语言太久,潜意识就已经认为=就是赋值.但其实把“=”换成@,换成“赋值”,又有什么不同呢),1是参数(可以流动的对象)tag1. tag1:人就是对象,对象会有固定的任务.提供接口(服务,工作)来保证整个程序的运行(社会),但是对象(人)会有各种情况要与其它的对象交流传递,此时

运算符重载

关键字:operator 相见:<高质量程序设计指南> P255 如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符. 如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数. 运算符重载的特殊性 如果重载为成员函数,则this对象发起对它的调用 如果重载为全局函数,则第一个参数发起对它的调用 禁止用户发明该语言运算符集合中不存在的运算符 除了函数调用运算符

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

C++:运算符重载函数之友元运算符重载

5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算符重载函数的语法如下: 在类的内部: friend 函数类型 operator运算符(形参表) { 函数体 } 在类的内部声明,在类外定义: class X{ ... friend 函数类型 operator运算符(形参表): }; 函数类型 X::operator运算符(形参表) { 函数体 }

[转]C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 1 int i;2 int i1=10,i2=10;3 i=i1+i2;4 std::co

C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 int i; int i1=10,i2=10; i=i1+i2; std::cout<<