2012-05-30 3 views
0

Я видел следующий код:Что это за оператор <синтаксис?

struct Point 
{ 
    int x,y; 
    bool operator <(const Point &p) const { 
     return x<p.x||(x==p.x&&y<p.y); 
    } 
}; 

Я не понимаю, что эта вещь:

bool operator <(const Point &p) const { 
     return x<p.x||(x==p.x&&y<p.y); 
} 

Что это?

+1

это может помочь вам: http://stackoverflow.com/q/4421706/1025391 – moooeeeep

+0

+1 для хорошо спроектированного вопроса. -1 для использования SO в качестве учебника C++. –

ответ

2

Это определение для operator, в данном конкретном случае operator <. Это то, что вызывается, когда кто-то делает:

Point a, b; 
if(a < b) 
{ 
    //... 
} 
1

Это функция-член, перегружает < оператор

Point a,b; 
a < b; // the member function is used here. 
+0

Вы уверены, что это перегружает? Это означало бы, что значение по умолчанию меньше, чем оператор, неявно предоставляемый компилятором в противном случае ... – AJG85

+2

@ AJG85: Нет, это подразумевает, что вы создаете еще одну функцию с именем '<', которое отличается по своим параметрам, и это именно то, что происходит. –

+0

Это просто придирчивая вещь. Я думаю, вы все равно можете назвать это перегрузкой оператора, даже если это не перегрузка функции, и этот оператор в противном случае будет неопределенным. – AJG85

7

Посмотрите, это очень просто.

Вы определили структуру, представляющую точку. Если у вас есть два таких структур, код в вопросе определяет оператор сравнения для них, так что вы можете написать что-то вроде

if (pt1 < pt2) { ... 

Как компилятор лечить < знак? В C++ он делает следующее: выражение pt1 < pt2 интерпретируется как pt1.operator < (pt2). То есть, вызывается метод со специальным именем operator < объекта pt1, аргумент которого равен pt2.

Давайте посмотрим, что он делает. const Point &p в своем аргументе обозначает другой сравниваемый операнд. const говорит, что мы не собираемся изменять операнд (это позволяет компилятору создавать более эффективный код), а & означает, что мы не копируем переданный struct, но работаем с фактическим экземпляром Point (это происходит быстрее, так как нет копирования для сравнения).

Теперь выражение x<p.x проверяет значение x в левом операнде (это this объект, то есть объект в контексте которого метод работает) ли * против x от правого операнда , Затем код проверяет случай, когда левая x равна правой, поэтому сравниваются y.


* Для языковых пуристов: формулировка не точна, но для начинающих, ориентированных на объяснение должно быть в порядке.

+0

+1 Я могу добавить, что 'pt1 AJG85

+0

@ AJG85: спасибо, только что добавил – Vlad

+0

спасибо очень понятным объяснениям –

1

В C++ структуры очень похожи на классы. То, что вы видите, есть определение оператора как метод экземпляра. Он сравнивает «эту» точку с (неизменяемой) точкой, на которую ссылается параметр «p», и не имеет права изменять «эту» точку из-за const после списка параметров.

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