Перегрузка функций - это особый случай. C++ позволяет объявлять несколько похожих функций с одинаковым именем в одной области видимости. Формальные списки параметров (число, тип, порядок параметров) этих функций с одинаковым именем должны быть разными. Это часто используется для обработки данных, реализующих схожие функции.Различные типы вопросов.
1. Правила перегрузки функций
- Имена функций должны быть одинаковыми.
- Списки параметров должны быть разными (разное количество, разный тип, разный порядок параметров и т. д.).
- Типы возвращаемых функций могут быть одинаковыми или разными.
- Просто иметь разные типы возвращаемых значений недостаточно, чтобы быть перегруженной функцией.
2. Перегрузка оператора
Так называемая перегрузка призвана придать новый смысл. Перегрузка функций позволяет имени функции иметь несколько функций и выполнять разные операции при разных обстоятельствах. Перегрузка операторов аналогична: один и тот же оператор может иметь разные функции. Перегрузка операторов реализуется через функции, что по сути является перегрузкой функций. Операторы, допускающие перегрузку:
имя оператора |
оператор |
Бинарные арифметические операторы |
+、-、*、、、% |
Реляционные операторы |
==、!=、、= |
Логические операторы |
||、&&、! |
Унарный оператор |
+, -, * (указатель) & (адрес) |
Операторы увеличения и уменьшения |
++、– |
Битовые операторы |
|、&、-、……、> |
оператор присваивания |
=、+=、-=、*=、/=、%=、&=、!=、^=、>= |
Распределение и освобождение пространства |
новый、удалить、новый[]、удалить[] |
Другие операторы |
()(вызов функции), ->(доступ к члену), ->*(доступ к указателю члена), ,(запятая) |
Перегруженные операторы не допускаются:
имя оператора |
оператор |
оператор доступа к участникам |
. |
оператор доступа к указателю члена |
. * |
оператор домена |
:: |
оператор длины |
размер() |
условный оператор |
?: |
Существует две формы перегрузки операторов: перегруженные функции служат членами класса, а перегруженные функции служат дружественными функциями класса; в зависимости от операндов операторов бинарные операторы служат функциями-членами класса, а унарные операторы служат функциями-членами класса. Функции-члены, бинарные операторы служат дружественными функциями класса, а унарные операторы служат дружественными функциями класса.
- Когда бинарный оператор используется в качестве дружественной функции, необходимо указать два параметра.
- Перегруженные оператором функции могут вызываться явно как функции-члены класса.
3. Распространенная перегрузка операторов
(1) Самовозрастающая и самоубывающая:
//前置运算符 ++a --a
operator++()
operator--()
operator++(Vector3 &v)
operator--(Vector3 &v)
//后置运算符 a-- a++
operator++(int)
operator--(int)
operator++(Vector3 &v,int)
operator--(Vector3 &v,int)
(2) Оператор присваивания:
String& String::operator=(String &s)
{
if(this!=&s)
{
delete[] str;
int length = strlen(s.str);
str = new char[length+1];
strcpy(str,s.str);
}
return (*this)
}
(3) Перегрузка оператора ввода-вывода:
friend ostream &operator<<( ostream &output,const Vector3 &v )
{
output << "F : " <<v.m_x<< " I : " << v.m_y<<v.m_z;
return output;
}
friend istream &operator>>( istream &input, Vector3 &v )
{
input >> v.m_x>> v.m_y>>v.m_z;
return input;
}