Перегрузка методов класса в C++

14 комментариев

Методы класса можно перегружать также, как и обычные функции. Особенно это удобно, когда нужно сделать несколько конструкторов, которые будут принимать разные параметры.

Например, попробуем создать основу класса decimal, который реализует длинную арифметику для чисел произвольной точности. В таких случаях, обычно хранят число внутри строки, а логика математических операций реализуется через написание соответствующих операторов класса.

Сделаем так, чтобы в конструктор этого класса можно было передавать и строку и число типа double.

// Передача в конструктор строки
decimal num1("10000000.999999");
// Передача числа
decimal num2(10000.0);

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

/**
 * Представим, что этот класс реализует длинную арифметику для чисел любой
 * точности
*/
class decimal
{
public:
    /*
     * Конструктор, принимающий в качестве аргумента строку, содержащую число
    */
    decimal(string number)
    {
        clog << "First constructor called\n";
    }

    /**
     * Конструктор принимат число типа double
    */
    decimal(double number)
    {
        clog << "Second constructor called\n";
    }

private:
    string number;
};

При передаче строки будет вызван первый конструктор, а при передаче числа — второй.

Полный текст программы:

#include <iostream>
#include <string>

using namespace std;

/**
 * Представим, что этот класс реализует длинную арифметику для чисел любой точности
*/
class decimal
{
public:
    /*
     * Конструктор, принимающий в качестве аргумента строку,
     * содержащее число
    */
    decimal(string number)
    {
        clog << "First constructor called\n";
        this->number = number;
    }

    /**
     * Конструктор принимает число типа double
    */
    decimal(double number)
    {
        /**
         * преобразуем double в строку с максимально возможной точностью
         * и записываем полученное значение в this->number
        */
        clog << "Second constructor called\n";
    }

private:
    string number;
};

int main()
{
    // Будет вызван первый конструктор
    decimal num1("10000000.999999");
    // Будет вызван второй конструктор
    decimal num2(10000.0);
    cin.get();
    return 0;
}

Конечно, наш класс пока ничего не делает, потому что реализация длинной арифметики выходит за рамки данной статьи. Но на этом примере можно понять, когда может быть полезно использовать перегрузку методов класса.

Задание: попробуйте написать класс student, в конструктор которого можно будет передавать либо его имя и фамилию, либо имя и год рождения. При передаче года рождения, должен считаться примерный возраст студента. Пример использования класса:

student stud1("Иван", "Иванов");
student stud2("Иван", 1990);

Следующий урок — определение и перегрузка операторов в C++.

Комментарии к статье: 14

Подождите, загружаются комментарии...

Возможность комментировать эту статью отключена автором. Возможно, во всем виновата её провокационная тематика или большое обилие флейма от предыдущих комментаторов.

Если у вас есть вопросы по содержанию статьи, рекомендуем вам обратиться за помощью на наш форум.