在 C++ 中传入 vs 分配 const 引用
Pass in vs assign const reference in C++
const string& x = functionA();
functionB(x); // depends on x is string or const string&
string str = x;
我们有 const ref x:
传递给函数B,所以基本上我们复制x的值并传递给函数B? (不是,取决于x是不是参考)
将x赋值给str,所以这里我们也复制了x的值?或者我们只是分配引用?
=======================
是的,我理解 functionB(x),这取决于传入的 x 是字符串还是字符串&。我现在的困惑仍然是第二个关于赋值的问题。
如果我们有这样的东西:
obj.fieldA = x;
obj已经创建,我们只是将x赋值给obj的fieldA。那么这里的 x 是副本还是只是参考?
- 用 'x' 调用 'functionB' 我们只是传递这个引用持有的那个值。
顺便说一下,引用的行为与指针非常相似。
它类似于:
void func(int val);
int a = 11;
int *ptr = &a;
func(*ptr); // same as functionB(x);
所以你是否通过复制传递它实际上取决于函数B的形式参数;
- 我们这里也有类似的情况。
在这一行中:
string str = x;
您正在通过将引用 'x' 持有的值传递给它的构造函数来初始化(创建)字符串 'str' (不要与赋值混淆,因为 str 是在这一行创建的),并且因为我们有由于移动语义,构造函数分离,在这里您将通过 const 引用将 'x' 传递给 'str' 的构造函数以复制它。
更新:
这个
obj.fieldA = x;
意味着你已经创建了,比方说,Object obj;
据此,语句 obj.fieldA = x;
将只是 'x'.
的复制
也许我不明白你最后一个问题,但假设 fieldA 又是 'string' 类型;
然后,当你写 obj.fieldA = x;
时,会调用类似(非常糟糕的例子,只是为了简化):
string& operator=(const string& other){
..
this->str_pointer = new char[other.size() + 1];
strcpy(this->str_pointer, other.str_pointer);
..
}
这意味着这个函数获取了 'x' 的地址并复制了它的数据。
总结:
string first = "text";
const string& x = first; // x behaves just like a pointer and holds address of 'first'
Object obj;
obj.fieldA = x; // <--- here
在我由于 'operator=' 声明接收引用(地址)而标记的行中,您将只传递 'x' 的地址,然后 'operator=' 将查看此内存地址并复制一份数据,放在那里。
所以,我们只是将 'x' 的值分配给 .fieldA,而不是引用。
const string& x = functionA();
functionB(x); // depends on x is string or const string&
string str = x;
我们有 const ref x:
传递给函数B,所以基本上我们复制x的值并传递给函数B? (不是,取决于x是不是参考)
将x赋值给str,所以这里我们也复制了x的值?或者我们只是分配引用?
=======================
是的,我理解 functionB(x),这取决于传入的 x 是字符串还是字符串&。我现在的困惑仍然是第二个关于赋值的问题。
如果我们有这样的东西:
obj.fieldA = x;
obj已经创建,我们只是将x赋值给obj的fieldA。那么这里的 x 是副本还是只是参考?
- 用 'x' 调用 'functionB' 我们只是传递这个引用持有的那个值。
顺便说一下,引用的行为与指针非常相似。 它类似于:
void func(int val);
int a = 11;
int *ptr = &a;
func(*ptr); // same as functionB(x);
所以你是否通过复制传递它实际上取决于函数B的形式参数;
- 我们这里也有类似的情况。
在这一行中:
string str = x;
您正在通过将引用 'x' 持有的值传递给它的构造函数来初始化(创建)字符串 'str' (不要与赋值混淆,因为 str 是在这一行创建的),并且因为我们有由于移动语义,构造函数分离,在这里您将通过 const 引用将 'x' 传递给 'str' 的构造函数以复制它。
更新:
这个
obj.fieldA = x;
意味着你已经创建了,比方说,Object obj;
据此,语句 obj.fieldA = x;
将只是 'x'.
的复制
也许我不明白你最后一个问题,但假设 fieldA 又是 'string' 类型;
然后,当你写 obj.fieldA = x;
时,会调用类似(非常糟糕的例子,只是为了简化):
string& operator=(const string& other){
..
this->str_pointer = new char[other.size() + 1];
strcpy(this->str_pointer, other.str_pointer);
..
}
这意味着这个函数获取了 'x' 的地址并复制了它的数据。
总结:
string first = "text";
const string& x = first; // x behaves just like a pointer and holds address of 'first'
Object obj;
obj.fieldA = x; // <--- here
在我由于 'operator=' 声明接收引用(地址)而标记的行中,您将只传递 'x' 的地址,然后 'operator=' 将查看此内存地址并复制一份数据,放在那里。
所以,我们只是将 'x' 的值分配给 .fieldA,而不是引用。