在理解“string ltrim(const string &)”的含义方面需要帮助
Need help in understanding meaning of ' string ltrim(const string &) '
我没有多少 C++ 经验。我的问题更多是关于确认我是否正确思考了一些问题。我试图理解一段代码,它有以下一行:
string ltrim(const string &);
我看到了以下答案:
1. What is the difference between "std::string const &s" and "const std::string &s"?
2. https://www.geeksforgeeks.org/stdstring-class-in-c/
3.https://codereview.stackexchange.com/questions/32842/passing-parameters-by-reference
我知道按值调用和按引用调用的概念。
- 什么是 'ltrim'?
在我看来,这是一个在这里声明的函数名,因为我知道 C++ 没有使用这个名称的预定义函数。我是否正确地假设它意味着它是一个名为 'ltrim' 的函数,类型为 'string',并且该函数有一个参数 'a constant string type'。
但是,通常我们有这样的功能:
void abc (int &a)
其中 a 是一个变量。变量是什么:
string ltrim(const string &);
因为 'const' 具有预定义的含义,而 'string' 是一种数据类型。参数中传递的变量是什么?
- 另外,如果没有变量,'&'在这里做什么。我了解通过引用调用一些 w.r.t C++,但我没有看到变量名,我不知道用来传递什么。
我试着在互联网上寻找一些信息,但我无法找到一个用字符串来解释这个的地方。
string ltrim(const string &);
这行代码声明存在一个名为 ltrim
的函数,它接受一个未命名的 const string&
参数,并且它 returns 一个 string
。
令人困惑的部分是 C++ 不需要函数参数的名称!当需要保留接口但实现不再使用该参数时,您会看到这种情况。
What is 'ltrim'?
你猜对了,ltrim
(left-trim) 是一个接受 const std::string&
作为参数并返回 std::string
的函数。我们实际上不需要像您习惯看到的那样为参数命名,因为我们还没有使用该参数。我们只会在定义函数体后使用它,当前代码行只是对函数的声明。
Also, if there is no variable, what does '&' do here. I understand
call by reference some what w.r.t C++, but I don't see a variable
name, I don't know what s being used to pass.
仅仅因为没有变量名并不意味着该函数不能请求对特定类型的引用。引用类型是类型的一部分,不是变量名的一部分,参数名是完全可选的:
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'...
}
该行声明了一个名为 ltrim
的函数,该函数 returns 是 string
并接受一个参数:对 const string
.
的引用
参数的名称是可选的。在这种情况下,函数 definition 可能具有该参数的名称,但也可以在此处省略。如果函数定义中的参数未命名,则无法在函数体中引用该参数,但如果您需要接受参数来实现某些接口但实际上不需要使用它,它会很有用。
C++ 中函数原型的目的是告诉编译器
- 函数的名称是什么,
- 其参数的类型是什么,以及
- 它是什么类型(如果有的话)returns.
这里的一个重要细节是上面的列表不包括参数名称。例如,以下所有代码段都声明了相同的函数:
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 ... //
}
编译器会非常满意,即使上述原型中的 none 使用了这些名称。
现在,对于一些奇怪的 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
,其值基本上从未使用过。或者,您可能会覆盖派生 class 中的函数,而不需要使用提供的参数。
这意味着我们在 C++ 中有三个规则:
规则一:忽略函数原型中的参数名称。
规则二:函数实现不必为其参数选择与其原型相同的名称。
规则三:参数根本不需要有名字。
将这三个规则组合在一起,您有时会看到这样的情况:
int myFunction(int, double); // Prototype gives no names to arguments
int myFunction(int a, double b) {
// .. use parameters a and b ... //
}
在这里,函数原型没有给它的参数命名,但没关系! C++ 仍然学习它需要的关于函数的一切(名称、return 类型和参数类型)。这是合法的,因为规则一和规则三。在实际需要引用参数的实现中,这些参数被命名为 a
和 b
。由于规则二,这些参数现在有了名称这一事实很好。
所以,return在你的例子中,函数原型
string ltrim(const string &);
表示"I'm declaring a function named ltrim
. It takes in a reference to a const string
, and it returns a string
."完全等同于说
string ltrim(const string& toTrim);
或
string ltrim(const string& oompaLoompa);
从外观上看,ltrim
的实际实现几乎肯定会命名其参数,以便它可以引用它和 trim 字符串。
希望对您有所帮助!
我没有多少 C++ 经验。我的问题更多是关于确认我是否正确思考了一些问题。我试图理解一段代码,它有以下一行:
string ltrim(const string &);
我看到了以下答案: 1. What is the difference between "std::string const &s" and "const std::string &s"? 2. https://www.geeksforgeeks.org/stdstring-class-in-c/ 3.https://codereview.stackexchange.com/questions/32842/passing-parameters-by-reference
我知道按值调用和按引用调用的概念。
- 什么是 'ltrim'?
在我看来,这是一个在这里声明的函数名,因为我知道 C++ 没有使用这个名称的预定义函数。我是否正确地假设它意味着它是一个名为 'ltrim' 的函数,类型为 'string',并且该函数有一个参数 'a constant string type'。
但是,通常我们有这样的功能:
void abc (int &a)
其中 a 是一个变量。变量是什么:
string ltrim(const string &);
因为 'const' 具有预定义的含义,而 'string' 是一种数据类型。参数中传递的变量是什么?
- 另外,如果没有变量,'&'在这里做什么。我了解通过引用调用一些 w.r.t C++,但我没有看到变量名,我不知道用来传递什么。
我试着在互联网上寻找一些信息,但我无法找到一个用字符串来解释这个的地方。
string ltrim(const string &);
这行代码声明存在一个名为 ltrim
的函数,它接受一个未命名的 const string&
参数,并且它 returns 一个 string
。
令人困惑的部分是 C++ 不需要函数参数的名称!当需要保留接口但实现不再使用该参数时,您会看到这种情况。
What is 'ltrim'?
你猜对了,ltrim
(left-trim) 是一个接受 const std::string&
作为参数并返回 std::string
的函数。我们实际上不需要像您习惯看到的那样为参数命名,因为我们还没有使用该参数。我们只会在定义函数体后使用它,当前代码行只是对函数的声明。
Also, if there is no variable, what does '&' do here. I understand call by reference some what w.r.t C++, but I don't see a variable name, I don't know what s being used to pass.
仅仅因为没有变量名并不意味着该函数不能请求对特定类型的引用。引用类型是类型的一部分,不是变量名的一部分,参数名是完全可选的:
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'...
}
该行声明了一个名为 ltrim
的函数,该函数 returns 是 string
并接受一个参数:对 const string
.
参数的名称是可选的。在这种情况下,函数 definition 可能具有该参数的名称,但也可以在此处省略。如果函数定义中的参数未命名,则无法在函数体中引用该参数,但如果您需要接受参数来实现某些接口但实际上不需要使用它,它会很有用。
C++ 中函数原型的目的是告诉编译器
- 函数的名称是什么,
- 其参数的类型是什么,以及
- 它是什么类型(如果有的话)returns.
这里的一个重要细节是上面的列表不包括参数名称。例如,以下所有代码段都声明了相同的函数:
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 ... //
}
编译器会非常满意,即使上述原型中的 none 使用了这些名称。
现在,对于一些奇怪的 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
,其值基本上从未使用过。或者,您可能会覆盖派生 class 中的函数,而不需要使用提供的参数。
这意味着我们在 C++ 中有三个规则:
规则一:忽略函数原型中的参数名称。
规则二:函数实现不必为其参数选择与其原型相同的名称。
规则三:参数根本不需要有名字。
将这三个规则组合在一起,您有时会看到这样的情况:
int myFunction(int, double); // Prototype gives no names to arguments
int myFunction(int a, double b) {
// .. use parameters a and b ... //
}
在这里,函数原型没有给它的参数命名,但没关系! C++ 仍然学习它需要的关于函数的一切(名称、return 类型和参数类型)。这是合法的,因为规则一和规则三。在实际需要引用参数的实现中,这些参数被命名为 a
和 b
。由于规则二,这些参数现在有了名称这一事实很好。
所以,return在你的例子中,函数原型
string ltrim(const string &);
表示"I'm declaring a function named ltrim
. It takes in a reference to a const string
, and it returns a string
."完全等同于说
string ltrim(const string& toTrim);
或
string ltrim(const string& oompaLoompa);
从外观上看,ltrim
的实际实现几乎肯定会命名其参数,以便它可以引用它和 trim 字符串。
希望对您有所帮助!