Какие вещи являются решающими при вызове во время перегрузки функций? - PullRequest
1 голос
/ 18 февраля 2012

Я просто хотел знать, что является решающим фактором при вызове функции во время перегрузки.Как я знаю, это сигнатура параметров, количество параметров, которые играют важную роль.Но есть ли постоянная часть, которая играет важную роль в перегрузке или нет.Перегрузка 1-й и 2-й функции работает нормально, но если добавить третью функцию с const в качестве характеристики в передаваемых параметрах, я получаю ошибку компиляции.int A::sum(int, int) and int A::sum(int, int) cannot be overloaded.Просто предоставив фрагмент кода для класса:

class A
{
    private:
    int x;
    int y;

    public:
    int sum ( int a, int b )
    {
        cout << " Inside 1st ";
        return (a+b) ;
    }

    int sum (int a ,int b) const
    {
        cout << " Inside 2nd ";
        return (a+b) ;
    }

    int sum (const int a ,const int b)
    {
        cout << " Inside 3rd ";
        return (a+b) ;
    }

    A(){x=0;y=0;}
    ~A(){};
}; 

Когда я объявляю обычный объект и вызываю сумму, вызывается первая функция, а в случае объекта const вызывается вторая сумма.Это прекрасно.Но если я пишу 1-ю и 3-ю функцию, это становится проблемой.Почему так?

Ответы [ 2 ]

5 голосов
/ 18 февраля 2012

Вы можете перегружать const -несс, но только там, где это действительно имеет значение. Что я имею в виду "на самом деле имеет значение"? Хорошо, если вы объявите

void foo(char *ptr);
void foo(const char *ptr);

значение const имеет значение: вы говорите, что одна перегрузка foo гарантирует, что не изменится память, которая ptr указывает на , а другая - нет. Но если вы объявите

void foo(int x);
void foo(const int x);

const не имеет значения : скалярные аргументы всегда передаются по значению, поэтому ни одна гипотетическая вариация foo не может изменить значение x в вызывающей программе, даже если это необходимо к. Поэтому стандарт C ++ говорит, что const отбрасывается, и это два разных объявления одной и той же функции , одно из которых ошибочное.

Положение const относительно * имеет значение. Указатель сам по себе является скаляром, поэтому это также два объявления одной и той же функции:

void foo(char *ptr);
void foo(char *const ptr);

потому что здесь const определяет сам указатель, а не объект, на который он указывает.

Это подводит нас к методам: квалификатор const после списка аргументов в объявлении метода применяется к объекту, указанному this, и может быть перегружен:

struct A
{
  int foo (char *ptr);
  int foo (char *ptr) const;
  int foo (const char *ptr);
  int foo (const char *ptr) const;
};

Вы должны думать, что эти декларации переписаны внутри:

struct A {};
int A_foo (A *this, char *ptr);
int A_foo (const A *this, char *ptr);
int A_foo (A *this, const char *ptr);
int A_foo (const A *this, const char *ptr);

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

2 голосов
/ 18 февраля 2012
Функции

const и не const могут быть перегружены. (const следует за функцией)
это допустимый критерий перегрузки функций.

Однако функции в вашем примере не могут быть перегружены на основе const ness аргументов функции, потому что постоянство аргументов не имеет значения вообще. Аргумент функции передается по значению, а функция получает копия этого.
Перегрузка функций требует, чтобы между функциями с одинаковыми именами были некоторые отличительные критерии, если только аргумент const на самом деле не делает перегрузку функций отличной от точки зрения компилятора перегрузкой с использованием константности аргумента функции не допускается.

Первое возможно, потому что,
Если у вас есть объект const, то вы можете вызывать только функцию const. Поскольку неконстантная функция обязана модифицировать члены класса и, следовательно, вызов ее для константного объекта является семантической ошибкой и приведет к ошибке компиляции.

Если у вас есть обычный on-const объект, то и функции const, и неконстантные версии действительны для вызова в экземпляре. Компилятор выбирает наиболее подходящий вариант - неконстантную версию.

...