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?
这实际上说明了C++最酷和最有用的功能之一:临时变量.由于您指定了字符串引用const,因此编译器允许您将对临时值的引用传递给该函数.所以,这是幕后发生的事情Dude d2 = Dude("bye");:
Dude::Dude(const string &).如何做出这个选择是一个完全不同的主题.string值.现在"bye"是一个const char[4],但是编译器可以平凡将其转换成一个const char *,而且是可以变成一个string.因此,创建了一个匿名临时变量(称为它temp1).string::string(const char *)被调用"bye",结果存储在temp1Dude::Dude(const string&)使用引用调用temp1.结果被分配给d2(实际上,它被分配到另一个临时变量和拷贝构造Dude与常量引用它调用和该被分配到D2.但在这种情况下,结果是相同的.)temp1被丢弃了.这string::~string()是运行字符串析构函数的地方temp1