【问题标题】:Pass in vs assign const reference in C++在 C++ 中传入 vs 分配 const 引用
【发布时间】:2020-09-05 21:54:16
【问题描述】:
const string& x = functionA();

functionB(x); // depends on x is string or const string&
string str = x;

我们有 const ref x:

  1. 传递给函数B,所以基本上我们复制x的值并传递给函数B? (不,取决于 x 是否参考)

  2. 将x赋值给str,所以这里我们也复制x的值?或者我们只是分配引用?

=========================

是的,我理解函数 B(x),它取决于传入的 x 是字符串还是字符串&。我现在的困惑仍然是关于作业的第二个问题。

如果我们有类似的东西:

obj.fieldA = x;

obj 已创建,我们只需将 x 分配给 obj 的 fieldA。那么这里的 x 是副本还是只是参考?

【问题讨论】:

  • 需要看看functionB 是如何被声明来回答这个问题的。
  • 如果 functionB 有作为参数“const string&”,则不会复制 afaik,因为您将 addr 传递给原始字符串。如果删除 ref,则该函数将进行复制。

标签: c++ reference variable-assignment


【解决方案1】:
  1. 用 'x' 调用 'functionB' 我们只是传递了该引用所持有的值。
    顺便说一句,引用的行为与指针非常接近。 类似于:
    void func(int val);

    int a = 11;
    int *ptr = &a;
    func(*ptr); // same as functionB(x);

所以你是否会复制传递它实际上取决于functionB的形参;

  1. 我们也有类似的情况。
    在这一行:
    string str = x;
    您正在初始化(创建)字符串“str”,通过将引用“x”持有的值传递给它的构造函数(不要与赋值混淆,因为在这一行创建了str),并且由于我们有构造函数的分离为了移动语义,在这里您将通过 const 引用将“x”传递给“str”的构造函数以复制它。

更新:
obj.fieldA = x; 表示你已经创建了,比如Object obj;
据此,声明obj.fieldA = x; 将只是复制“x”。
也许我不明白你的最后一个问题,但假设 fieldA 又是“字符串”类型;
然后,当你写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,而不是引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2011-06-13
    • 2011-03-12
    相关资源
    最近更新 更多