2010-09-03 3 views
2

Я являюсь промежуточным пользователем C++, и я столкнулся со следующей ситуацией. Определение класса, показанное ниже, компилируется с помощью компилятора 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; 
} 

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

+0

перегруженные 'оператор()'? Что перегружено 'operator()'? В вашем коде нет перегруженного 'operator()'. Вот почему вы не можете его использовать. – AnT

+0

Да. Я очень ошибался. Оператор ключевого слова взял меня в другое место. – vthulhu

+0

Возможный дубликат [Что означает этот синтаксис C++ и почему он работает?] (Http://stackoverflow.com/questions/3632746/what-does-this-c-syntax-mean-and-why-does-it -work) – sbi

ответ

7

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

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

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

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

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

+0

Спасибо! Это круто! – vthulhu

+0

@vthulu: U, похоже, является новым для сообщества, поэтому для вашей информации, если вы удовлетворены приведенным выше ответом, вам нужно выбрать отметку, которая появляется рядом с этим ответом, что по сути означает, что вы принимаете ответ – mukeshkumar

+2

«Обратите внимание, что операторы преобразования (например, оператор int()) могут быть вызваны в неожиданные моменты времени и могут вызвать пагубные ошибки». Я бы сказал это несколько сильнее: __Убедитесь от них! __ – sbi

0

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

#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; 

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