Рубрики

Перегрузка функций и ключевое слово const

Предсказать вывод следующей программы на C ++.

#include<iostream>

using namespace std;

  

class Test

{

protected:

    int x;

public:

    Test (int i):x(i) { }

    void fun() const

    {

        cout << "fun() const called " << endl;

    }

    void fun()

    {

        cout << "fun() called " << endl;

    }

};

  

int main()

{

    Test t1 (10);

    const Test t2 (20);

    t1.fun();

    t2.fun();

    return 0;

}

Вывод: вышеприведенная программа компилируется и работает нормально, и выдает следующий вывод.

fun() called
fun() const called

Два метода «void fun () const» и «void fun ()» имеют одинаковую сигнатуру, за исключением того, что один является const, а другой — нет. Также, если мы более внимательно посмотрим на вывод, мы заметим, что const void fun () вызывается для объекта const, а void fun () вызывается для неконстантного объекта.
C ++ позволяет перегружать методы-члены на основе типа const. Перегрузка на основе типа const может быть полезна, когда функция возвращает ссылку или указатель. Мы можем сделать одну функцию const, которая возвращает константную ссылку или указатель const, другую неконстантную функцию, которая возвращает неконстантную ссылку или указатель. Смотрите это для более подробной информации.

А как насчет параметров?
Правила, связанные с параметрами const, интересны. Давайте сначала посмотрим на следующие два примера. Программа 1 завершается неудачно при компиляции, но программа 2 компилируется и работает нормально.

// ПРОГРАММА 1 (Ошибка при компиляции)
#include<iostream>

using namespace std;

  

void fun(const int i)

{

    cout << "fun(const int) called ";

}

void fun(int i)

{

    cout << "fun(int ) called " ;

}

int main()

{

    const int i = 10;

    fun(i);

    return 0;

}

Выход:

Compiler Error: redefinition of 'void fun(int)'

// ПРОГРАММА 2 (компилируется и работает нормально)
#include<iostream>

using namespace std;

  

void fun(char *a)

{

  cout << "non-const fun() " << a;

}

  

void fun(const char *a)

{

  cout << "const fun() " << a;

}

  

int main()

{

  const char *ptr = "GeeksforGeeks";

  fun(ptr);

  return 0;

}

Выход:

const fun() GeeksforGeeks

C ++ допускает перегрузку функций на основе постоянства параметров, только если параметр const является ссылкой или указателем. Вот почему программа 1 не удалось собрать, но программа 2 работала нормально. Это правило действительно имеет смысл. В программе 1 параметр «i» передается по значению, поэтому «i» в fun () является копией «i» в main (). Следовательно, fun () не может изменить 'i' функции main (). Следовательно, не имеет значения, принимается ли «i» в качестве параметра const или обычного параметра. Когда мы передаем ссылку или указатель, мы можем изменить указанное или указанное значение, чтобы у нас было две версии функции, одна из которых может изменять указанное или указанное значение, а другая — нет.

В качестве упражнения прогнозируем результат следующей программы.

#include<iostream>

using namespace std;

  

void fun(const int &i)

{

    cout << "fun(const int &) called ";

}

void fun(int &i)

{

    cout << "fun(int &) called " ;

}

int main()

{

    const int i = 10;

    fun(i);

    return 0;

}

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

Рекомендуемые посты:

Перегрузка функций и ключевое слово const

0.00 (0%) 0 votes