2015-02-19 3 views
-3

У меня есть простой класс,Почему странное поведение с operator()?

class Func 
{ 
public: 
    Func() 
    { 
     cout<<"Constructor"<<endl; 
    } 

    int operator()(int) 
    { 
     cout<<"Operator()"; 
     return 0; 
    } 
}; 
  1. Когда я создаю это объект, давая скобку, Func f();, он ничего не печатает, он должен печатать Constructor. Но когда я создаю объект без круглых скобок, он печатает Constructor, который ожидается. В чем разница между этими двумя?
  2. Когда я пытаюсь использовать operator() f(2), это дает мне ошибку компиляции.

ошибка C2660: 'е': функция не принимает аргументов 1

не правда ли странное поведение, или я что-то не хватает?

+3

Потому что вы объявляете 'f' как функцию *, которая не принимает аргументов и возвращает объект' Func'. –

+1

[самый неприятный парсинг] (http://stackoverflow.com/q/20529434/1708801) –

+1

@ShafikYaghmour Не думайте, что это квалифицируется как «наиболее» досадно. Это ИМО зарезервировано для чего-то вроде 'Foo f (Bar(), Baz());' –

ответ

3

Func F() ;, он ничего не печатает, он должен печатать Конструктор

Это не верно вообще.

Вот как вы создаете Func:

Func f; 

Когда я пытаюсь использовать оператор() е (2) он дает мне ошибку компиляции. ошибка C2660: 'f': функция не принимает 1 аргумент. Разве это не странное поведение, или я что-то упускаю?

Да, это странно, но это не неожиданно. Когда вы написали Func f(), вы объявили функцию с именем f, возвращающую Func. Все, что вы пытаетесь сделать с f, после этого, естественно, сломано.

+0

Но когда у меня есть один конструктор аргументов, он работает. –

+0

@PranitKothari: 100% несвязанный. –

+0

Но почему? Должно ли это сделать что-то большее для 0 args и 1 arg. –

1

Это немного интересно здесь.

Func f(); 

- это декларация для функции, которая не принимает аргументов и возвращает объект типа Func.

Проверьте код ниже:

#include <iostream> 
using namespace std; 

class Func 
{ 
public: 
    int operator()(int) 
    { 
     return 0; 
    } 
}; 

int main() 
{ 
    Func f(); 
    f(); 
    return 0; 
} 

Func f() 
{ 
    cout << "My Func" << endl; 
    Func * f = new Func; 
    return *f; 
} 

Это выведет "Мой Func" на стандартный вывод.

+0

'f' функция имеет утечку памяти. –

+0

Да, я просто упомянул об этом, чтобы проиллюстрировать эту проблему. –

+0

@AbhishekMittal: Независимо, вы учите сломанную функцию. –

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