多种方式通过引用传递?

zeu*_*unk 0 c++ pointers pass-by-reference

我总是通过引用传递函数原型中的dereferencing,然后在传入参数时引用变量.我最近看到的似乎也是一种通过引用传递的方式,但它的工作方式略有不同.它引用原型中的参数,但在将值输入函数时不期望任何类型的(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
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*oll 5

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

这有点令人困惑,因为该&角色在两个不同的环境中使用.请参阅以下行:

something(&test1, test2);
Run Code Online (Sandbox Code Playgroud)

在该行中,&符号用于告诉编译器" 将此变量的地址传递给函数something",没有符号的第二个参数是通过引用正确传递.

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

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