как С++ понимает, какую функцию нужно использовать?
в этом коде:
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)" нужно использовать?!
@hadisamani1996, 👍2
Обсуждение2 ответа
Лучший ответ:
Вызов функции перегрузки запускает процесс разрешение перегрузки, который использует типы аргументов для выбора правильной функции для вызова
Если указать аргумент 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
? Откуда мы должны это знать? Не зная этого, ваш вопрос не имеет смысла.
Компилятор решает, какую функцию использовать, основываясь на информации о типе переменной. Представьте, что вы пишете
str += "test";
Если вы объявите str
константой, строка выше вызовет ошибку. Поэтому, если вместо этого вы напишете AdptSendReply(str)
, компилятор вызовет функцию const. Аналогичным образом, если вы объявите str
как изменяемую переменную, приведенная выше строка будет нормально скомпилирована, и если вы вызовете AdptSendReply(str)
, компилятор будет использовать неконстантную переменную . функция.
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
- ошибка: ожидаемое первичное выражение перед токеном ','
Вы знаете, что первое и второе не одно и то же. Второй передает пустую строку. Также первое, возможно, не нужно, так как ссылка на константную строку может быть инициализирована "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