Нужна помощь в понимании значения «string ltrim (const string &)» - PullRequest
3 голосов
/ 20 июня 2019

У меня мало опыта в C ++.Мой вопрос больше о подтверждении, если я правильно думаю с некоторыми вопросами.Я пытался понять код, и он имеет следующую строку:

string ltrim(const string &);

Я видел следующие ответы: 1. В чем разница между "std :: string const & s" и "conststd :: string & s "? 2. https://www.geeksforgeeks.org/stdstring-class-in-c/ 3. https://codereview.stackexchange.com/questions/32842/passing-parameters-by-reference

Я знаю концепцию вызова по значению и вызова по ссылке.

  1. Что такое 'ltrim'?

Мне кажется, что это объявленное здесь имя функции, потому что я знаю, что в C ++ нет предопределенной функции с этим именем,Правильно ли предположить, что это означает, что это функция с именем «ltrim» типа «строка», и эта функция имеет параметр «тип константной строки».

Однако обычно у нас есть такие функции, как:

void abc (int &a)

, где a - переменная.В чем заключается переменная:

string ltrim(const string &);

, потому что «const» имеет предопределенное значение, а «string» - это тип данных.Какая переменная передается в параметре?

Кроме того, если нет переменной, что здесь делает '&'.Я понимаю, что вызов по ссылке кое-что по сравнению с C ++, но я не вижу имени переменной, я не знаю, что используется для передачи.

Я пытался поискать информацию в Интернете, ноя не мог прижиться к месту, которое объясняет это в терминах строки.

Ответы [ 4 ]

5 голосов
/ 20 июня 2019

Что такое "итрим"?

Ваше предположение верно, ltrim (обрезка влево) - это функция, принимающая const std::string& в качестве параметра и возвращающая std::string. На самом деле нам не нужно присваивать параметру имя, которое вы привыкли видеть, потому что мы еще не используем этот параметр. Мы будем использовать его только после того, как определим тело функции, текущая строка кода является только объявлением функции.

Кроме того, если нет переменной, что здесь делает '&'. я понимаю вызывать по ссылке, что-то W.r.t C ++, но я не вижу переменную имя, я не знаю, что используется для передачи.

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

void Foo(int, const int&, int*)
{
  // stuff..
}

int main()
{
  Foo(1, 2, nullptr);
}

Этот код совершенно допустим, если Foo не пытается получить доступ к параметрам. Не может, потому что у них нет имени.


Разделение объявления и определения и присвоение параметру имени в одном, а не в другом также совершенно допустимо:

void Foo(int);

int main()
{
  Foo(1);
}

void Foo(int bar)
{
  // stuff with 'bar'...
}
3 голосов
/ 20 июня 2019
string ltrim(const string &);

Эта строка кода объявляет, что существует функция с именем ltrim, что она принимает безымянный параметр const string& и возвращает string.

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

2 голосов
/ 20 июня 2019

Цель прототипа функции в C ++ - сообщить компилятору

  • как называется функция,
  • что это за типы аргументов и
  • какой тип (если есть) он возвращает.

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

int myFunction(int a, double b);
int myFunction(int apples, double bananas);
int myFunction(int pizkwat, double zyzzyzyplyz);

Более того, фактическая реализация myFunction не потребует использования каких-либо имен, приведенных здесь. Например, мы могли бы написать

int myFunction(int snickerdoodle, double alfajores) {
    // ... do something ... //
}

и компилятор был бы совершенно доволен этим, даже если ни один из вышеперечисленных прототипов не использовал эти имена.

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

void doSomething(int) {
   // This function takes in an integer. You can't call it without
   // passing in that integer. However, this function has no way of
   // referencing its argument, because it doesn't have a name!
}

Вы видите, что это используется на практике. Например, перегрузка оператора постфикса ++ требует объявления функции с именем operator++, которая принимает int, значение которого по существу никогда не используется. Или, возможно, вы переопределяете функцию в производном классе и вам не нужно использовать предоставленные аргументы.

Это означает, что у нас есть три правила в C ++:

Правило одно : имена параметров в прототипах функций игнорируются.

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

Правило три : у параметров вообще не должно быть имен.

Комбинируя эти три правила вместе, вы иногда видите такие вещи:

int myFunction(int, double); // Prototype gives no names to arguments

int myFunction(int a, double b) {
    // .. use parameters a and b ... //
}

Здесь прототип функции не дает имен своим параметрам, но это нормально! C ++ все еще изучает все, что нужно о функции (имя, тип возвращаемого значения и типы аргумента). Это законно из-за первого правила и третьего правила. В реализации, которая действительно должна ссылаться на параметры, этим параметрам присваиваются имена a и b. Тот факт, что эти параметры теперь имеют имена, вполне подходит из-за второго правила.

Итак, возвращаясь к вашему примеру, прототип функции

string ltrim(const string &);

означает «Я объявляю функцию с именем ltrim. Она принимает ссылку на const string и возвращает string». Это полностью эквивалентно высказыванию

string ltrim(const string& toTrim);

или

string ltrim(const string& oompaLoompa);

Фактическая реализация ltrim, судя по всему, почти наверняка назовет свой параметр, чтобы он мог ссылаться на него и обрезать строку.

Надеюсь, это поможет!

1 голос
/ 20 июня 2019

Эта строка объявляет функцию с именем ltrim, которая возвращает string и принимает один параметр: ссылку на const string.

Имя параметра необязательно. В этом случае вполне вероятно, что функция definition имеет имя для этого параметра, но оно также может быть опущено. Если параметр не указан в определении функции, то нет ссылки на этот параметр в теле функции, но это может быть полезно, если вам нужно принять параметр для выполнения какого-либо интерфейса, но на самом деле его не нужно использовать.

...