当我在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)只是作为参考?

+2

的_lvalue_的拷贝构造函数将被调用,如果它是一个_shallow copy_取决于它的实现。目前还不清楚你究竟在问什么。 –

+0

如果写入时复制字符串被禁用,它将执行深层复制 – James

+2

忘记“浅”或“深”复制。它只是复制引用引用的对象。复制的语义是为被复制的对象的类型定义的(在这种情况下,是'std :: string'。) – juanchopanza

它创建的参考值的副本,它不会让你与p编辑s的内容,使p充当参考,并能够从p编辑s,你必须申报它作为参考:

std::string& p = s; 
+0

换句话说,在这方面,'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; 
}