Hello,

Can anyone tell me what the code beneath means. I've searched but can't find a clear explanation. Maybe someone can give an example of how to use it.

Thanks...

bool MyClass::operator()()
{ 
 ....
}
class MyClass
{
virtual bool operator()();
}

Dani AI

Generated

operator() is the function-call operator — overload it to make objects callable like functions (the “functor” / function-object pattern). That’s what showed and what referred to by “functor.” ’s comment about operator overloading is also relevant: operator() is just another operator you define, and writing obj(args...) invokes that operator. Two useful details people often miss are constness/mutable (when a functor needs internal state) and making operator() virtual for polymorphic callables.

A compact example showing a const call operator that still updates internal metrics (useful for caching or statistics):

struct Counter {
    mutable int calls = 0;
    int operator()() const { return ++calls; } // callable even on const objects
};

Because operator() is const, the object can be passed or stored as const; mutable lets the counter be modified inside the const call operator.

For runtime polymorphism you can make the call operator virtual:

struct Predicate {
    virtual bool operator()(int) const = 0;
    virtual ~Predicate() {}
};

struct IsEven : Predicate {
    bool operator()(int x) const override { return x % 2 == 0; }
};

A Predicate* p = new IsEven; bool r = (*p)(4); invokes IsEven::operator(). Note: virtual call operators work, but for most code std::function, templates, or (since C++11) lambdas are simpler and often faster than virtual dispatch.

Practical tips: prefer operator() const when possible; use mutable for bookkeeping in const operators; mark small, frequently-called operators noexcept when they do not throw; prefer lambdas for short stateless callables; use virtual operator() only when you truly need polymorphic objects. This complements the earlier examples in the thread and clarifies why virtual bool operator()(); in ’s snippet makes calls dispatch dynamically.

Recommended Answers

All 6 Replies

You can use operator() to overload operators...
ok, say you've got a rectangle(height, witdh) and you want to add two:

Rectangle1 += Rectangle 2;

The compiler will be very sad.

If you make operator-overloading in your class, you can tell the compiler what it's suppose to do when you add two classes.
I don't have a concrete example, but google for operator-overloading.

found on google:

#include <iostream>
using namespace std;
 
class CVector {
public:
int x,y;
CVector () {};
CVector (int,int);
CVector operator + (CVector);
};
 
CVector::CVector (int a, int b) {
x = a;
y = b;
}
 
CVector CVector::operator+ (CVector param) {
CVector temp;
temp.x = x + param.x;
temp.y = y + param.y;
return (temp);
}
 
int main () {
CVector a (3,1);
CVector b (1,2);
CVector c;
c = a + b;
cout << c.x << "," << c.y;
return 0;
}

I already googled for operator overloading. Most of them I understand but not this specific one, operator().

operator() lets your values look like functions.

For example

struct greeter {
  std::string greeting_text;

  int operator()(const std::string& greetee) {
    std::cout << greeting_text << ", " << greetee << "!" << std::endl;
    return 12345;
  }
};

// later:
greeter alien_greet, programmer_greet;
alien_greet.greeting_text = "Greetings";
programmer_greet.greeting_text = "Hello";
int x;
x = alien_greet("earthling"); // prints "Greetings, earthling!"
programmer_greet("world"); // prints "Hello, world!"

std::cout << x << std::endl; // outputs 12345

Generally speaking, operator() tries to provide the ability to create functions that contain internal parameters of their own.

In addition, you may want to search for "functor" or "function object" for more information.

It makes more sense now. Thanks....

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.