在函数中重用 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
}