как С++ понимает, какую функцию нужно использовать?

c++

в этом коде:

    void AdptSendReply(const char* str)
{
    string s(strlen(str) + 2);
    s = str;
    AdptSendReply(s);
}

void AdptSendReply(const string& str)
{
    string s(str.length() + 2);
    AdptSendReply(s); // используем следующий
}

void AdptSendReply(string& str)
{
    if (AdapterConfig::instance()->getBoolProperty(PAR_LINEFEED)) {
        str += "\r\n";
        AdptSendString(str);
    }
    else {
        str += "\r";
        AdptSendString(str);
    }
}

Я думаю, что С++ использует возможность перегрузки. Но как он может распознать, какую из двух функций "void AdptSendReply(string&str)" или "void AdptSendReply(const string&str)" нужно использовать?!

, 👍2

Обсуждение

Вы знаете, что первое и второе не одно и то же. Второй передает пустую строку. Также первое, возможно, не нужно, так как ссылка на константную строку может быть инициализирована "c-string" (const char *) - временный объект создается с неявным преобразованием., @KIIV

это может ответить на ваш вопрос https://arduinoprosto.ru/q/3079/how-to-retrieve-the-data-type-of-a-variable#3080 ........ тесты компилятора аргумент функции аналогичным образом, @jsotola

Это оффтоп здесь, вы должны спросить об этом в другом месте, может быть, в основном потоке стека? Но да, это перегрузка, и у компилятора есть правила, определяющие, какую функцию использовать; вы можете проверить руководство по C++ или C++ Primer/tutorial для получения дополнительной информации., @esoterik

Что такое «строка»? Почему эта информация отсутствует в вашем вопросе?, @AnT

Вероятно, это std::string, судя по коду, однако на самом деле это не вопрос Arduino, а вопрос C++, который лучше задать на [Stack Overflow](http://stackoverflow.com/). Я вижу, что люди голосуют, чтобы закрыть этот вопрос, и если он будет закрыт, просто спросите в Stack Overflow. Они специалисты по C++. :), @Nick Gammon


2 ответа


Лучший ответ:

1

Вызов функции перегрузки запускает процесс разрешение перегрузки, который использует типы аргументов для выбора правильной функции для вызова

  • Если указать аргумент lvalue типа string, компилятор вызовет версию void AdptSendReply(string& str).

    string s = "hello";
    AdptSendReply(s); // вызывает 'string& стр 'версия
    
  • Если указать аргумент lvalue типа const string, компилятор вызовет void AdptSendReply(const string& str) version.

    const string s = "hello";
    AdptSendReply(s); // вызывает 'const string& стр 'версия
    
  • Если указать аргумент rvalue, компилятор вызовет void AdptSendReply(const string& str) version.

    AdptSendReply(string("hello")); // calls 'const string& str' version
    

И так далее. Полный набор правил, регулирующих разрешение перегрузок, довольно обширен, особенно когда контекст включает неявные преобразования.


Непонятно, что вы подразумеваете под "обязательно использовать". Обычно перегруженные функции делают то же самое (с точки зрения функциональности), а это означает, что вам не нужно беспокоиться о том, какую функцию использовать. Просто вызовите ее с доступным аргументом, и компилятор выберет правильную функцию для вызова.

Кроме того, что такое string? Откуда мы должны это знать? Не зная этого, ваш вопрос не имеет смысла.

,

0

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

str += "test";

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

,