gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:40:54 26 4
gpt4 key购买 nike

我正在自学 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com