Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串值还是指针? 我从C++开始,了解如何将 STD::String 作为参数传递给函数。 void foo(std::string text) { // ... } std::string data = "Hello World!"; foo(data);_C++_Pointers - Fatal编程技术网

字符串值还是指针? 我从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 ,那么做的行为是不确定的。