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

标签 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;
}

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

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

最佳答案

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

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

关于C++:使用 & 运算符进行引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7987761/

相关文章:

java - 计数器直观的对象参数行为

c++ - 什么时候通过引用在另一个 lambda 中捕获一个 lambda 是安全的?

php - 在 PHP 中测试可选参数

c++ - 将 std::string 从一种语言环境转换为另一种语言环境

c++ append 到字符串

c++ - 如何确保 TCP 文件传输完成(c++)

c - char* 的位运算

java - Java 中数组是按值传递还是按引用传递?

c++ - boost program_options自定义解析

c++ - KDevelop 中的项目文件