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