C++ 关于字符串变量pass作为pass by value的澄清

C++ 关于字符串变量pass作为pass by value的澄清,c++,C++,当我们将类的对象作为复制构造函数调用的值传递给函数时。它将处于连续循环中。但是它在字符串的情况下是如何工作的 例如: #include <iostream> #include <string> using namespace std; string read_string(std::string s) { std::string test; cout<<s; test=s; return test; } int main(

当我们将类的对象作为复制构造函数调用的值传递给函数时。它将处于连续循环中。但是它在字符串的情况下是如何工作的

例如:

#include <iostream>
#include <string>

using namespace std;

string read_string(std::string s)
{
    std::string test;
    cout<<s;
    test=s;
    return test;
}

int main() 
{
    string sir = "start";
    cout << "SIR starts out as : '" << sir << "'" << endl;
    sir = read_string(sir);
    cout << "and becomes '" << sir << "', after return from function." << endl << endl;
    return 0;
}
#包括
#包括
使用名称空间std;
字符串读取\字符串(标准::字符串s)
{
字符串测试;

cout复制构造函数不会按值获取原始对象,否则会导致无限递归,正如您所说。事实上,所有复制构造函数都通过引用获取原始对象。它们的签名是

T::T(const T&);

通过这种方式,复制构造函数可以作为常量引用访问原始对象(而不是副本),因此它可以执行必要的“复制”操作。

复制构造函数不会按值获取原始对象,否则会导致无限递归,正如您所说。事实上,所有复制构造函数都通过引用获取原始对象。它们的签名是

T::T(const T&);

通过这种方式,复制构造函数可以访问原始对象(而不是副本)作为常量引用,因此它可以执行必要的“复制”操作 通过值通过引用是:

  • pass by reference处理传递给函数的原始数据(相同内存)

  • 传递值将数据复制到功能范围内的不同(新的和临时的)内存位置(即在该功能内创建和销毁)


此规则适用于基本类型(如
int
float
double
)以及自定义类型(如
类对象
std::string
等)。

它们之间的基本区别 通过值通过引用是:

  • pass by reference处理传递给函数的原始数据(相同内存)

  • 传递值将数据复制到功能范围内的不同(新的和临时的)内存位置(即在该功能内创建和销毁)


此规则适用于基本类型(如
int
float
double
)以及自定义类型(如
类对象
std::string
等)。

std::string
与任何其他类一样,是一个类。您觉得困惑的是什么?您所说的“连续循环”是什么意思?@Quentin,std::string是类我们如何将这个类的对象传递给函数一个可以编写自己的类,在不同的构造函数和析构函数中输出,看看它在执行的不同阶段发生了什么。@iBug,如果我们按值传递对象,以防复制构造函数在内部再次调用复制构造函数,那么它将是in-loop
std::string
是一个类似于任何其他类的类。您觉得什么让人困惑?您所说的“in-continuous loop”是什么意思?@Quentin,std::string是类我们如何将这个类的对象传递给函数一个可以编写自己的类,在不同的构造函数和析构函数中输出,看看它在执行的不同阶段发生了什么。@iBug,如果我们按值传递对象,以防复制构造函数在内部再次调用复制构造函数,那么它将是现在我开始理解这个问题:现在我开始理解这个问题:D