当我在C++中为对象赋值时,会发生什么?
#include <iostream>
void test(std::string &s) {
std::string p = s;
std::cout << p.length() << " " << p;
}
int main() {
std::string s = "Hello world";
test(s);
return 0;
}
所以,功能test
从我main
函数接收到我的字符串s
参考。当我在C++中为对象赋值时,会发生什么?
我的问题是,什么方面做:
std::string p = s;
是否浅复制引用,并把它放在p
,从而击败首先使用参考的目的是什么?
还是(p
)只是作为参考?
它创建的参考值的副本,它不会让你与p
编辑s
的内容,使p
充当参考,并能够从p
编辑s
,你必须申报它作为参考:
std::string& p = s;
换句话说,在这方面,'std :: string'的行为与'int'相同。这是关于C++的好处之一,就是这种一致性。 'int p = i'会创建一个新的'int',用'i'的副本初始化,因此提问者不应该期待'std :: string p = s'有任何不同。 –
从而击败首先使用参考的目的是什么?
为什么它失败了引用的目的,你已经声明s
作为参考,不是吗?不是p
。所以正如指出的那样,它会复制s
包含的值。
当我在C++中为一个对象赋值时,会发生什么?
你不能指定参考值,或者至少你不应该这样认为。引用不是一个指针。会发生什么是您分配一个对象的值,因为引用是对象,通过不同的名称访问。
void test(std::string &s) {
,你是在处理一个参考的事实是,在声明的时候才真正重要。此函数中使用s
的所有代码使用std::string
,而不是std::string &
。
我的问题是,这是什么做行:
std::string p = s;
它赋予你的std::string
对象p
,没有更多,不会少。换句话说,它同样的,因为它会在这个方案:
int main() {
std::string s = "Hello world";
std::string &s_with_different_name = s;
std::string p = s_with_different_name;
std::cout << p.length() << " " << p;
}
或者更简单地说,在这样的:
int main() {
std::string s = "Hello world";
std::string p = s;
std::cout << p.length() << " " << p;
}
的_lvalue_的拷贝构造函数将被调用,如果它是一个_shallow copy_取决于它的实现。目前还不清楚你究竟在问什么。 –
如果写入时复制字符串被禁用,它将执行深层复制 – James
忘记“浅”或“深”复制。它只是复制引用引用的对象。复制的语义是为被复制的对象的类型定义的(在这种情况下,是'std :: string'。) – juanchopanza