C++:使用&运算符传递引用

hig*_*ggy 3 c++ pass-by-reference

我正在自学C++,在这个过程中,我正在编写简单的小程序来学习基本思想.关于"传递引用",我很困惑为什么下面的代码工作(一些代码只是练习重载构造函数):

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

class Dude
{
public:
  string x;
  Dude();                    // Constructor 1
  Dude(const string &a);     // Constructor 2
};

Dude::Dude() : x("hi") {}
Dude::Dude(const string &a) : x(a) {}

int main()
{
  Dude d1;
  Dude d2 = Dude("bye");

  cout << d1.x << endl;
  cout << d2.x << endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在"main()"中,我创建一个"Dude"类型的对象"d2",并使用构造函数2将"x"设置为字符串"bye".

但是在构造函数2的声明中,我告诉它接受字符串的地址,而不是字符串本身.那么为什么我可以传递它"bye"(这是一个字符串).为什么我不必创建变量字符串,然后将该字符串的地址传递给Dude的Constructor 2?

Dav*_*iva 5

这实际上说明了C++最酷和最有用的功能之一:临时变量.由于您指定了字符串引用const,因此编译器允许您将对临时值的引用传递给该函数.所以,这是幕后发生的事情Dude d2 = Dude("bye");:

  • 编译器确定要使用的最佳构造函数是Dude::Dude(const string &).如何做出这个选择是一个完全不同的主题.
  • 但是,为了使用该构造函数,您需要一个string值.现在"bye"是一个const char[4],但是编译器可以平凡将其转换成一个const char *,而且可以变成一个string.因此,创建了一个匿名临时变量(称为它temp1).
  • string::string(const char *)被调用"bye",结果存储在temp1
  • Dude::Dude(const string&)使用引用调用temp1.结果被分配给d2(实际上,它被分配到另一个临时变量和拷贝构造Dude与常量引用它调用和被分配到D2.但在这种情况下,结果是相同的.)
  • temp1被丢弃了.这string::~string()是运行字符串析构函数的地方temp1
  • 控制传递到下一个语句

  • "bye"不是`const char*`,它是一个`const char [4]`.它*衰减*到上面的上下文中的指针. (3认同)