多种方式通过引用传递?

时间:2013-12-01 20:33:33

标签: c++ pointers pass-by-reference

我总是通过引用在函数原型中通过引用传递,然后在传入参数时引用变量。我最近看到的似乎也是一种通过引用传递的方式,但它的工作方式略有不同。它引用原型中的参数,但在将值输入函数时不期望任何类型的(de)引用。使用我的方法时,您必须使用“ - >”运算符访问成员函数,但使用其他方法时可以使用“。”运营商。您能否解释一下这两种方法之间的区别,以及实际中是否有更常用的方法。我在下面有一些示例代码来更好地解释我的意思:

#include <iostream>
#include <string>
using namespace std;

void something(string *byRef, string &dontKnow);

int main(int argc, const char * argv[])
{
    string test1 = "test string 1";
    string test2 = "second test";

    something(&test1, test2);

    return 0;
}

void something(string *byRef, string &dontKnow) {
    cout << "test1 address = " << byRef << "\nsize = " << byRef->size() << endl;//size function accessed by "->"
    cout << "test2 address = " << &dontKnow << "\nsize = " << dontKnow.size() << endl;//now accessed by "." and reference operator required for address
}

2 个答案:

答案 0 :(得分:5)

string &dontKnow是&#34;官方&#34;通过引用传递的方式,第一种方式string *byRef通过获取要传递的对象的地址来传递指针

它有点令人困惑,因为&字符用于两个不同的上下文中。请参阅以下行:

something(&test1, test2);

在该行中,&符号用于告诉编译器&#34;将此变量的地址传递给函数something&#34;,第二个参数没有&符号是一个适当的参考传递。

由于以下几个原因,第一种方法没有通过引用正确传递:

  1. 如果你的方法接受一个指针参数,它可以在技术上接收一个NULL指针,通过引用正确传递,你不能这样做
  2. 您正在将指针的副本传递给该函数。

答案 1 :(得分:2)

传递*不是通过引用传递,而是通过指针传递。从更深层次的意义上讲,它在技术上是相同的,但是通过它的指针使用对象时必须使用的synthax是不同的。 Afaik在C ++中使用指针的唯一原因是,如果您希望变量具有NULL的能力,或者您希望代码可以移植到C。