2010-05-05 5 views
10

Как различать перегрузку двух версий оператора ++?Оператор приращения C++

const T& operator ++(const T& rhs) 

какой?

i++; 
++i; 
+13

Что может написать ваш учебник на C++ по этому вопросу? – 2010-05-05 23:10:24

ответ

10

Эти операторы унарные, то есть они не принимают параметр правой руки.

Что касается вашего вопроса, если вы действительно должны перегружать этих операторов, для предварительного использования используйте подпись const T& operator ++() и для постинкремента, const T& operator(int). Параметр int является манекеном.

+3

Они могут быть функциями, не являющимися членами. –

+0

@gf True. Но это не было бы моим первым выбором для операторов инкремента. (Мой первый выбор состоял бы в том, чтобы не перегружать операторов, так или иначе.) –

+2

@ Daniel: У вас нет выбора, если вы хотите написать итератор C++ 'ish или итератор. –

3

для постфикса ++ и - операторы, функция должна принимать фиктивный int аргумент. если у него нет аргументов, то это префиксный оператор

2

Подумайте о приращении постфикса i++ как о наличии второго (отсутствующего) параметра (т. Е. i++x). Поэтому postfix increment signature имеет правый параметр, в то время как приращение префикса не работает.

11

Для версий, не являющиеся членов, функция с одним параметром является префиксом в то время как функция с двумя параметрами, а вторыми int является постфикс:

struct X {}; 
X& operator++(X&);  // prefix 
X operator++(X&, int); // postfix 

Для членов-версий, версия с нулевым параметром является префиксом и версии один-параметра, принимающих int является постфикс:

struct X { 
    X& operator++(); // prefix 
    X operator++(int); // postfix 
}; 

int параметра на звонки операторов постфиксных будет иметь нулевое значение.

+0

@gf добавить пример, и это был бы лучший ответ –

+0

@Caspin: Хороший момент, сделано. –

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