2012-11-07 3 views
0

Я задавался вопросом о том, как перегрузка оператора()Оператор перегрузки() и различные способы и условия ее можно использовать

Например

class A{ 
    int a,b; 
public: 
    void operator()(int x, int y); 
}; 

void A::operator()(int x, int y){ 
    x = a; 
    y = b; 
} 

int main(){ 
    A a = new A(); 
    a(5,4); // this will call the overloaded operator 
    return 0; 
} 

мне было интересно, если есть какие-либо другое использование случаев к следующему и любому другому сценарию, где это может быть вызвано.

+1

Вы запрашиваете варианты использования 'operator()' _in general_ (это довольно широкий вопрос тогда ...), или вы спрашиваете о конкретной реализации указанного выше оператора, то есть оператора, который использует аргументы как входные данные для набора данных? – jogojapan

+0

Когда вы говорите следующее: вы имеете в виду _выше, верно? – jogojapan

+0

Перегруженный оператор также можно вызвать с помощью 'a.operator() (5,4)', если это то, о чем вы просите ... – Mankarse

ответ

3

operator() как и любая другая функция. Единственное различие заключается в том, что вместо того, чтобы называть его a.foo(), вы пишете a().

Вы можете использовать его точно так же, как и любую другую функцию, вы можете перегрузить ее столько, сколько хотите, она может иметь столько параметров, сколько вы хотите (включая ноль), ее можно шаблонировать и что-нибудь еще, что вы можете думать о что может сделать любая другая функция.

0

В общем случае оператор() используется для вызова функции-объекта, вызывающей семантику. Если ваш объект можно рассматривать как «что-то делать», тогда имеет смысл использовать этот оператор. Эти объекты известны как функторы. Они часто используются для инкапсуляции некоторых действий, которые будут выполняться повторно, особенно для многих объектов.

См. Заголовки STL algorithm и functional для интересных примеров и целей.

Кстати, вы назначаете A, но назначаете его объекту вместо указателя. И вы вызываете свой A::operator(), когда вы распределяете A, и ваш компилятор должен жаловаться. Измените A a = new A() на что-то вроде A* a = new A; или проще A a;, так как a не должен существовать за пределами исполнения основного. Если вы используете версию указателя, вы должны позвонить operator() так (*a)(5,4);

Также ваш A::operator() не будет иметь никакого эффекта. Аргументы x и y передаются по значению. Передайте их вместо ссылки.

Смежные вопросы