当我在C ++中为对象分配引用的值时会发生什么?

时间:2015-07-12 10:38:48

标签: 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会从我的s函数接收对我的字符串main的引用。

我的问题是,这一行做了什么:

std::string p = s;

它是否浅层复制引用并将其放入p,从而首先破坏了使用引用的目的?

或者它(p)只是作为参考吗?

3 个答案:

答案 0 :(得分:2)

它创建了引用值的副本,它不允许您使用s编辑p的内容,以使p充当参考并且能够从s编辑p,您必须将其声明为参考:

std::string& p = s;

答案 1 :(得分:1)

  

从而首先打破了使用引用的目的?

为什么它会破坏引用的目的,你已经声明s作为参考,不是吗?不是p。如上所述,它确实会复制s包含的值。

答案 2 :(得分:1)

  

当我在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;
}