在函数中重用 C++ 中的字符串
Reusing String in C++ in function
作为目前为止主要语言是 Python 的人,我在字符串重用方面遇到了问题。
这是一个示例代码(已简化):
void function(std::string &basicString)
{
std::cout << "Function print: " << &basicString << "\n";
}
int main()
{
std::vector<std::string> x_files;
/*
Does sth, x_files contains some strings
*/
for (std::vector<std::string>::size_type i = 0; i != x_files.size(); i++) {
std::string temp = x_files[i];
std::cout << temp << "\n";
function(temp);
}
return 0;
}
事情是这样的,因此我想要这个:
my_string
Function print: my_string
相反,我得到了这个:
my_string
Function print: 0x7cd2346eaf1827cd
0x7cd2346eaf1827cd - 不是我每次都得到的,而是一个例子。
std::cout << "Function print: " << &basicString << "\n";
这里你使用一元&
运算符,它是一个address-of运算符,换句话说它给你一个指针。由于这不是 char 指针,std::cout
打印指针值,换句话说,内存地址,作为十六进制。
解决方法很简单,去掉&
:
std::cout << "Function print: " << basicString << "\n";
也许您对指针感到困惑,因为如果您使用指针而不是引用,您会这样做:
void function(std::string *basicString)
{
std::cout << "Function print: " << *basicString << "\n";
}
指针和引用非常相似,但它们并不相同,包括它们在声明和使用方式上的差异。
最后,您可能想要传递一个 const 引用:
void function(const std::string &basicString)
您应该始终将 const
与参考参数一起使用,除非您打算修改原始参数。
C++(与许多其他语言一样)是一种基于上下文的语言。例如,在您给定的片段中,当您写道:
void function(std::string &basicString) //here basicString is a lvalue reference to std::string
{
}
在上面的代码片段中,您定义了一个名为 function
的函数,它接受一个参数,该参数的类型是 对 std::string
的左值引用。也就是说,&
符号表示此上下文中的 左值引用 。
另一方面,当您写道:
std::cout << "Function print: " << &basicString << "\n";
此处的 &
符号表示您正在获取 basicString
所指变量的地址。
解决方案
要解决这个你只需要删除&
符号,如下所示:
void function(std::string &basicString) //NO NEED TO REMOVE & FROM HERE
{
std::cout << "Function print: " << basicString << "\n"; //REMOVED & FROM HERE
}
作为目前为止主要语言是 Python 的人,我在字符串重用方面遇到了问题。
这是一个示例代码(已简化):
void function(std::string &basicString)
{
std::cout << "Function print: " << &basicString << "\n";
}
int main()
{
std::vector<std::string> x_files;
/*
Does sth, x_files contains some strings
*/
for (std::vector<std::string>::size_type i = 0; i != x_files.size(); i++) {
std::string temp = x_files[i];
std::cout << temp << "\n";
function(temp);
}
return 0;
}
事情是这样的,因此我想要这个:
my_string
Function print: my_string
相反,我得到了这个:
my_string
Function print: 0x7cd2346eaf1827cd
0x7cd2346eaf1827cd - 不是我每次都得到的,而是一个例子。
std::cout << "Function print: " << &basicString << "\n";
这里你使用一元&
运算符,它是一个address-of运算符,换句话说它给你一个指针。由于这不是 char 指针,std::cout
打印指针值,换句话说,内存地址,作为十六进制。
解决方法很简单,去掉&
:
std::cout << "Function print: " << basicString << "\n";
也许您对指针感到困惑,因为如果您使用指针而不是引用,您会这样做:
void function(std::string *basicString)
{
std::cout << "Function print: " << *basicString << "\n";
}
指针和引用非常相似,但它们并不相同,包括它们在声明和使用方式上的差异。
最后,您可能想要传递一个 const 引用:
void function(const std::string &basicString)
您应该始终将 const
与参考参数一起使用,除非您打算修改原始参数。
C++(与许多其他语言一样)是一种基于上下文的语言。例如,在您给定的片段中,当您写道:
void function(std::string &basicString) //here basicString is a lvalue reference to std::string
{
}
在上面的代码片段中,您定义了一个名为 function
的函数,它接受一个参数,该参数的类型是 对 std::string
的左值引用。也就是说,&
符号表示此上下文中的 左值引用 。
另一方面,当您写道:
std::cout << "Function print: " << &basicString << "\n";
此处的 &
符号表示您正在获取 basicString
所指变量的地址。
解决方案
要解决这个你只需要删除&
符号,如下所示:
void function(std::string &basicString) //NO NEED TO REMOVE & FROM HERE
{
std::cout << "Function print: " << basicString << "\n"; //REMOVED & FROM HERE
}