The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"проблемы с operator()"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"проблемы с operator()"
Сообщение от dmitriy Искать по авторуВ закладки(??) on 09-Авг-04, 15:10  (MSK)
Что это за оператор?
Почему при попытке его использования вызывается деструктор класса?
Как этого избежать.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "проблемы с operator()"
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 10-Авг-04, 13:11  (MSK)
>Что это за оператор?
>Почему при попытке его использования вызывается деструктор класса?
>Как этого избежать.

Good day, dear colleague. It is a function call operator.
Function call, that is, the notation expression(expressionlist), can be interpreted as a binary operation with the expression as the lefthand operand and the expressionlist as the righthand operand. The call operator () can be overloaded in the same way as other operators can. An argument list for an operator()() is evaluated and checked according to the usual argumentpassing rules. Overloading function call seems to be useful primarily for defining types that have only a single operation and for types for which one operation is predominant. The most obvious, and probably also the most important, use of the () operator is to provide
the usual function call syntax for objects that in some way behave like functions. An object that acts like a function is often called a functionlike object or simply a function object. Such
function objects are important because they allow us to write code that takes nontrivial operations as parameters. For example, the standard library provides many algorithms that invoke a function for each element of a container. Consider:

void negate(complex& c) { c= c; }

void f(vector<complex>& aa, list<complex>& ll)
{
for_each(aa.begin() ,aa.end() ,negate) ; // negate all vector elements
for_each(ll.begin() ,ll.end() ,negate) ; // negate all list elements
}

....

(c) Bjarne Stroustrup "The C++ Programming Language (special edition)"

This operator never call object destructor if you don't do this manually. Good luck!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "проблемы с operator()"
Сообщение от genie Искать по авторуВ закладки on 11-Авг-04, 09:16  (MSK)
It depeneds on what the operator() does - if it returns an object (not a reference or a pointer) then the temporary object will be created on the stack and deleted after having been used - that's where the destructor is being called.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "проблемы с operator()"
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 11-Авг-04, 11:56  (MSK)
>It depeneds on what the operator() does - if it returns an
>object (not a reference or a pointer) then the temporary object
>will be created on the stack and deleted after having been
>used - that's where the destructor is being called.

Yeah, you are right in this way. It is obviously, but it is a question of destructor of the class where operator() () was called. IMHO.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру