字符串值还是指针? 我从C++开始,了解如何将 STD::String 作为参数传递给函数。 void foo(std::string text) { // ... } std::string data = "Hello World!"; foo(data);
在这种情况下,如果我没有弄错的话,字符串值将传递给函数。因此,无论我对函数字符串值还是指针? 我从C++开始,了解如何将 STD::String 作为参数传递给函数。 void foo(std::string text) { // ... } std::string data = "Hello World!"; foo(data);,c++,pointers,C++,Pointers,在这种情况下,如果我没有弄错的话,字符串值将传递给函数。因此,无论我对函数foo中的text变量做什么,它都不会对数据变量产生任何影响 但是,对于某些函数(例如std::getline),我怎么可能以完全相同的方式传递字符串,然后它们更改其值呢 std::string row; std::getline(std::cin, row); // now the value of row is changed 谢谢通过参考传递: void foo(std::string &text) {
foo
中的text
变量做什么,它都不会对数据
变量产生任何影响
但是,对于某些函数(例如std::getline),我怎么可能以完全相同的方式传递字符串,然后它们更改其值呢
std::string row;
std::getline(std::cin, row);
// now the value of row is changed
谢谢通过参考传递:
void foo(std::string &text)
{
// ...
}
C++中有几个选项:
voidfoo(std::stringtext)
,您用foo(data)调用它代码>。您正确地观察到,在foo
中对data
所做的任何修改都不会反映在调用方中。从概念上讲,一个深度副本被获取(如果这样做没有副作用,编译器可能会优化副本;但是你最好不要依赖它)
voidfoo(std::string&text)
,您用foo(data)调用它代码>。在foo
中对data
所做的任何修改都会反映在调用方中
const
参考。函数原型是voidfoo(conststd::string&text)
,您称之为foo(data)代码>。这是我最喜欢的:foo
不允许修改数据
:这样的尝试将发出编译时错误。此外,将不会获取字符串的深度副本
voidfoo(std::string*text)
,您称之为foo(&data)
foo
可以修改字符串const
指针。函数原型是voidfoo(const std::string*text)
,您称之为foo(&data)代码>。与(3)中一样,foo
无法修改传递的字符串
因为1和2的调用语法是相同的,有些人不喜欢传递可以通过引用修改的内容,因为调用者不清楚参数是否可以更改。在C中传递变量有几个选项++ 1) 按价值
std::string
的复制构造函数用于在foo
中创建本地实例,修改保留在本地实例中
2) 参照
void foo(std::string &value) { /* ... */ }
// ... call
foo(data);
void foo(const std::string &value) { /* ... */ }
// ... call
foo(data);
参数变量被引用,因此foo
中的value
指向传递给函数的同一对象。更改会反映在调用代码中
3) 常量引用
void foo(std::string &value) { /* ... */ }
// ... call
foo(data);
void foo(const std::string &value) { /* ... */ }
// ... call
foo(data);
如(2)所示,参数对象被引用,而不是创建新实例。但是,合同不允许在foo
内修改您的值。在内存和性能方面,这可能比复制整个字符串的(1)更便宜
4) 用指针
void foo(std::string *value) { /* ... */ }
// ... call
foo(&data);
将data
的地址作为参数传递给foo
。它类似于引用,只是依赖于指针逻辑。为了访问value
中的字符串,您必须取消引用(*value)
或value->某个字符串函数()中的指针
5) 通过指向常量对象的指针
void foo(const std::string *value) { /* ... */ }
// ... call
foo(&data);
与(4)类似,但指针引用的对象是常量,与引用案例(3)类似。请注意,指针本身不是常量,因此可以将其指向其他对象。但是,指针是本地的(虽然指向的对象不是本地的),因此更改foo
中的指针地址对数据对象没有影响。第二个参数是输出参数<代码>标准::获取行(标准::cin,行)
但是这个函数不应该被foo(&data)
调用吗?所以我想我错了,当时我认为指针和refereneces是一样的,不是吗?引用不是指针。引用是名称别名(即,同一对象的另一个名称)。无引用不是指针。主要区别:引用不能被重新绑定,一个指针可以是“代码> NulLPTR < /代码>。这是非常基础的,它将在你的C++书籍中解释,继续阅读。我希望我有一个:)然后用“教程”或任何你正在学习的来源替换“书”。权威的C++图书指南和列表@ MartinHeraleck获得一个,或者学习一门教程或课程,因为这不是一个教程网站。看起来芭丝谢芭打字^^快了一点,但你错过了const
指针。如果你把它包括进去,我会投票的。@Bathsheba,你知道,你在哪里输入的更快:P。我肯定还有更多错误的方法(比如用构造函数对某个自定义类型进行常量引用,该构造函数接受一个std::string
)来传递变量,但这是另一种方法story@Bathsheba好了,我想你现在很开心吧在阅读了更多的C++基础书籍之后,你就会知道这是什么意思。在案例3和5中,函数实际上可以通过丢弃常量来修改经过的字符串。但是如果“原始”变量是<代码> const ,那么做的行为是不确定的。