102 lines
4.4 KiB
Markdown
102 lines
4.4 KiB
Markdown
|
---
|
|||
|
title: C++ Overloading
|
|||
|
localeTitle: Перегрузка C ++
|
|||
|
---
|
|||
|
C ++ позволяет указать более одного определения для имени функции или оператора в той же области, которая называется перегрузкой функций и перегрузкой оператора соответственно.
|
|||
|
|
|||
|
Перегруженное объявление представляет собой объявление, объявленное с тем же именем, что и ранее объявленное объявление в той же области видимости, за исключением того, что обе декларации имеют разные аргументы и, очевидно, другое определение (реализация).
|
|||
|
|
|||
|
Когда вы вызываете перегруженную функцию или оператор, компилятор определяет наиболее подходящее определение для использования, сравнивая типы аргументов, которые вы использовали для вызова функции или оператора, с типами параметров, указанными в определениях. Процесс выбора наиболее подходящей перегруженной функции или оператора называется разрешением перегрузки.
|
|||
|
|
|||
|
### Перегрузка функций в C ++
|
|||
|
|
|||
|
Вы можете иметь несколько определений для одного и того же имени функции в той же области. Определение функции должно отличаться друг от друга по типам и / или количеству аргументов в списке аргументов. Вы не можете перегружать объявления функций, которые отличаются только возвращаемым типом.
|
|||
|
|
|||
|
Ниже приведен пример, когда одна и та же функция print () используется для печати разных типов данных -
|
|||
|
|
|||
|
```cpp
|
|||
|
#include <iostream>
|
|||
|
#include <string>
|
|||
|
using namespace std;
|
|||
|
|
|||
|
class printData {
|
|||
|
public:
|
|||
|
void print(int i) {
|
|||
|
cout << "Printing int: " << i << endl;
|
|||
|
}
|
|||
|
void print(double f) {
|
|||
|
cout << "Printing float: " << f << endl;
|
|||
|
}
|
|||
|
void print(const string& s) {
|
|||
|
cout << "Printing string: " << s << endl;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
int main() {
|
|||
|
printData pd;
|
|||
|
|
|||
|
// Call print to print integer
|
|||
|
pd.print(5);
|
|||
|
|
|||
|
// Call print to print float
|
|||
|
pd.print(500.263);
|
|||
|
|
|||
|
// Call print to print string
|
|||
|
pd.print("Hello C++");
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
|
|||
|
```
|
|||
|
Printing int: 5
|
|||
|
Printing float: 500.263
|
|||
|
Printing string: Hello C++
|
|||
|
```
|
|||
|
|
|||
|
### Перегрузка оператора в C ++
|
|||
|
|
|||
|
Большинство встроенных операторов также могут быть перегружены на C ++. Это позволяет программистам назначать различную реализацию операторам в зависимости от аргументов. Эти перегруженные операторы могут работать для определенного пользователем класса.
|
|||
|
```
|
|||
|
#include<iostream>
|
|||
|
using namespace std;
|
|||
|
|
|||
|
class Complex_Number{
|
|||
|
private:
|
|||
|
int real;
|
|||
|
int imag;
|
|||
|
public:
|
|||
|
Complex_Number(int i = 0, int j =0)
|
|||
|
{
|
|||
|
real = i;
|
|||
|
imag = j;
|
|||
|
}
|
|||
|
//Here the operator '+' is being overloaded
|
|||
|
Complex_Number operator + (Complex_Number const &a)
|
|||
|
{
|
|||
|
Complex_Number x;
|
|||
|
x.real = real + a.real;
|
|||
|
x.imag = imag + a.imag;
|
|||
|
return x;
|
|||
|
}
|
|||
|
void print()
|
|||
|
{
|
|||
|
cout<<real<<" + i"<<imag<<endl;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
Complex_Number c1(3, 2), c2(1, 1);
|
|||
|
//Here, the overloaded operator is called. The numbers get added according to the function defined
|
|||
|
Complex_Number c3 = c1 + c2;
|
|||
|
c3.print();
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Выход для вышеуказанной программы
|
|||
|
```
|
|||
|
4 + i3
|
|||
|
|
|||
|
```
|