01 ++ - формат перегружена функция
Оператор инкремента и декремента операторы передний и задний точек, таких, как:
a++ // 后置自增运算符
++a // 前置自增运算符
b-- // 后置自减运算符
--b // 前置自减运算符
Чтобы отличить переопределяется оператором является передняя или задняя часть оператора, C ++, обеспечивает:
- Pre-оператор , как один юань оператор накладки , которые функция члена имеют следующий формат:
T & operator++(); // 前置自增运算符的重载函数,函数参数是空
T & operator--(); // 前置自减运算符的重载函数,函数参数是空
- Задний оператор , как два юаней перегрузка операторов, написать бесполезный параметр, число перегруженной функции члена следующим образом :
T operator++(int); // 后置自增运算符的重载函数,多一个没用的参数
T operator--(int); // 后置自减运算符的重载函数,多一个没用的参数
02 обсуждаются передний и задний оператор возвращает значение
Передняя и задняя функция перегрузки оператора заключается в следующем:
функцию - член оператора перегрузки предварительно разместить оператор перегрузки функции - члены
--- | ---
T & оператор ++ (); | Т оператор ++ (целое);
Т & operator-- (); | T оператор - ( целое);
уведомление разница еще? Таким образом, вопрос:
- Почему передний оператор возвращает ссылку
&
? - Почему сзади возвращает оператор обычный объект (временный объект)?
Главным образом из-за исходные C ++ для того, чтобы поддерживать передние и задние характеристики оператора:
- Характеристики переднего оператора
int a = 0
// (++a) = 5; 可以拆解成:
// a = a + 1;
// a = 5;
(++a) = 5; // 前置++
После того, как первое приращение +1 к значению а равно 1, то а = участие в работе 5, значение а, наконец, 5.
Это показывает , что (A ++) возвращает переменную после приращения, переменную процесса в последующем вычислении, то значение переменной будет изменено. Таким образом, возвращаемое значение функции оператора предварительно перегружена должна быть ссылка &
.
- Оператор характеристика пост
Тогда оператор дома, не может быть оставлен в качестве значения, т.е. (a++) = 5;
не установлен, то функция поста-перегрузка оператора возвращает объект нормального значения.
03 ++ - написанный оператор функции перегрузки
int main()
{
CDemo d(10);
cout << d++ << ","; // 等价于 d.operator++(0);
cout << d << ",";
cout << ++d << ","; // 等价于 d.operator++();
cout << d << ",";
cout << d-- << ","; // 等价于 d.operator--(0);
cout << d << ",";
cout << --d << ","; // 等价于 d.operator--();
cout << d << endl;
return 0;
}
Выход:
10,11,12,12
12,11,10,10
Предположим, что вы хотите достичь результатов выше основной функции вывода, и как писать?
Во- первых , мы определили CDemo
класс, но и приращение, декремент оператор хорошо перегружать определение функции.
class CDemo
{
public:
CDemo(int i = 0):m_num(i) {} // 构造函数
CDemo & operator++(); // 前置自增运算符重载
CDemo operator++(int); // 后置自增运算符重载
CDemo & operator--(); // 前置自减运算符重载
CDemo operator--(int); // 后置自减运算符重载
private:
int m_num; // 成员变量
};
Затем продолжать добиваться до- инкремент, декремент оператор перегрузки функции:
// 前置++
CDemo & CDemo::operator++()
{
++m_num;
return *this;
}
// 前置--
CDemo & CDemo::operator--()
{
--m_num;
return *this;
}
Пост- увеличение, уменьшение перегрузки операторов, немного отличается, например , сообщение ++ участвует в первой операции, то самовозбуждение, возвращаемое значение не увеличивается от передней части объекта, в частности , реализуется следующим образом :
// 后置++
CDemo CDemo::operator++(int)
{
CDemo tmp(*this); // 记录修改前的对象
m_num--;
return tmp; // 返回修改前的对象
}
// 后置--
CDemo CDemo::operator--(int)
{
CDemo tmp(*this); // 记录修改前的对象
m_num++;
return tmp; // 返回修改前的对象
}
Сравнение производительности 04 передние и задние операторы
Из приведенного выше примера мы видим, что этап выполнения пост-перегруженный оператор функции:
- Во-первых, чтобы произвести временный объект для удержания объекта до того, как приращение или декремент нет;
- переменная член затем увеличивается или уменьшается;
- И, наконец, вернуться к объекту до изменения;
Шаг предварительно перегружен оператор функции:
- переменная приращения члена или декремент;
- Возвращает ссылку на объект;
Видимая, передние оператора перегрузка , чем разместить перегрузки работы оператора выше, накладные расходы являются относительно небольшой.
Конечно, те из обычного типа переменной, такие как INT, двойной, длинный и т.д., передняя и задняя разница в производительности не велика. Это очень важно , когда мы используем итератор объекты и увеличение или уменьшения, предпочтительно с передним оператором способом, так что накладные расходы могут быть уменьшены .