Синтаксис перегрузки оператора неявного преобразования

Я средний пользователь С++, и я столкнулся со следующей ситуацией. Определение класса, показанное ниже, прекрасно компилируется компилятором g++. Но я не могу понять, что именно означает весь синтаксис.
Я предполагаю, что функция operator int() возвращает тип int.

Более того, я не могу понять, как использовать перегруженный operator () в main()

class A
{
   public:
     A(int n) { _num = n; }  //constructor 

     operator int();

   private:
     int _num;
};

A::operator int()  // Is this equivalent to "int A::operator()" ??
{
  return _num;
}

int main()
{
  int x = 10;
  A objA(x);  //creating & initializing

  // how to use operator() ?
  // int ret = objA();   // compiler error when uncommented

  return 0;
}

Любая помощь будет оценена.


person vthulhu    schedule 03.09.2010    source источник
comment
Перегружен operator ()? Что перегрузило operator ()? В вашем коде нет перегруженных operator (). Вот почему вы не можете использовать его.   -  person AnT    schedule 03.09.2010
comment
Ага. Я очень ошибался. Оператор ключевого слова привел меня в другое место.   -  person vthulhu    schedule 03.09.2010
comment
возможный дубликат Что означает этот синтаксис C++ и почему это работает?   -  person sbi    schedule 03.09.2010


Ответы (2)


operator int() – это функция преобразования, которая объявляет определяемое пользователем преобразование из A в int, чтобы вы могли писать код наподобие

A a;
int x = a; // invokes operator int()

Это отличается от int operator()(), который объявляет оператор вызова функции, который не принимает аргументов и возвращает int. Оператор вызова функции позволяет вам писать код наподобие

A a;
int x = a(); // invokes operator()()

Какой из них вы хотите использовать, полностью зависит от поведения, которое вы хотите получить. Обратите внимание, что операторы преобразования (например, operator int()) могут вызываться в неожиданное время и вызывать опасные ошибки.

person James McNellis    schedule 03.09.2010
comment
@vthulu: Вы, кажется, новичок в сообществе, поэтому просто для информации: если вы удовлетворены приведенным выше ответом, вы можете выбрать галочку, которая появляется рядом с этим ответом, что по существу означает, что вы принимаете ответ - person mukeshkumar; 03.09.2010
comment
Обратите внимание, что операторы преобразования (например, оператор int()) могут вызываться в неожиданное время и вызывать серьезные ошибки. Я бы сказал несколько сильнее: Держитесь от них подальше! - person sbi; 03.09.2010
comment
@hype Сделано. Спасибо! Я просто читал StackOverflow в течение достаточно долгого времени, но я никогда не участвовал. Как говорится - Необходимость... - person vthulhu; 03.09.2010
comment
@sbi: Да, это хороший, смелый совет. :-P Каждый раз, когда я его реализовывал, это был взлом. По крайней мере, в C++0x с явными операторами преобразования вредоносность будет значительно меньше. - person James McNellis; 03.09.2010
comment
@James: То же самое здесь. Все, что я написал за последнее десятилетие (ну, во всяком случае, в первой его половине; с тех пор я усвоил урок), мне пришлось удалить позже (иногда болезненно), потому что это вызывалось в неожиданное время и вызывало проблемы. . О, и я бы хотел, чтобы кто-то с полувековым опытом работы с C++1x выпустил для этого хорошую книгу о том, что нужно и чего нельзя делать. - person sbi; 03.09.2010
comment
@sbi: Ну, надеюсь, мы увидим некоторого нового гуру Неделя конкурсов в ближайшее время здесь, на Stack Overflow :-) - person James McNellis; 03.09.2010
comment
@James: О, я этого не знал! Но если я что-то не упустил, шансы на то, что это произойдет, кажутся не очень хорошими. - person sbi; 03.09.2010

вы можете использовать этот

#include <iostream>
using namespace std;
class A{
public:
    A(int n)  { _num=n;}
    operator int();

private:
    int _num;

};
A::operator int(){

    return _num;

}
int main(){

    A  a(10);
    cout<<a.operator int()<<endl;
    return 0;

}
person dato datuashvili    schedule 03.09.2010