当前位置: 首页 > 知识库问答 >
问题:

通过值或常量引用传递?[重复]

赵志
2023-03-14

有一组好的规则来确定是按值传递还是常量引用

  • 如果函数打算将参数更改为副作用,则通过non-const引用。
  • 如果函数不修改它的参数,并且参数是基元类型,则按值取它。
  • 否则通过const引用获取它,除非在以下情况下:如果函数需要复制const引用,则按值获取它。

对于以下构造函数,如何确定它?

class A
{
public:
    A(string str) : mStr(str) {} // here which is better, 
                                 // pass by value or const reference?

    void setString(string str)  { mStr = str; } // how about here?

private:
    string mStr;
};

共有3个答案

邢浩邈
2023-03-14

在这种情况下,最好通过常量引用传递参数。原因:string是一种类类型,您不需要修改它,它可以是任意大的。

卢皓轩
2023-03-14

你网站上的文章不是软件工程的好参考。(它也可能过时了,因为它谈论的是移动语义学,而且是从2003年开始的。)

一般规则很简单:按常量引用传递类类型,按值传递其他类型。有明确的例外情况:按照标准库的约定,通常也会按值传递迭代器和函数对象。

其他任何事情都是优化,在分析器告诉您必须进行优化之前,不应该进行优化。

章昊
2023-03-14

在这种特殊情况下,假设C 11和字符串的move构造/赋值,您应该按值获取参数并将其移动到构造函数的成员。

A::A(string str) : mStr(std::move(str)) {}

二传的情况有点棘手,我不确定你是否真的想/需要优化它的每一点。。。如果您想最大限度地优化,可以提供两个重载,一个采用右值引用,另一个采用常量左值引用。无论如何,常量左值引用可能是一种足够好的方法:

void A::setString(string const& str) { mStr = str; }

为什么不同?

对于构造函数,成员尚未构建,因此需要分配内存。您可以将内存分配(以及数据的实际复制,但这是出租方的成本)移动到接口,这样,如果调用方有临时内存,则可以在不进行额外内存分配的情况下转发。

在分配的情况下,事情要复杂一点。如果字符串的当前大小足够大,可以容纳新值,则不需要分配,但如果字符串不够大,则需要重新分配。如果将分配移动到接口(通过值参数),则即使不需要分配,也将始终执行分配。如果分配是在函数内部完成的(const reference参数),那么对于一小部分情况(参数是临时的,大于当前缓冲区的情况),将执行本来可以避免的分配。

 类似资料:
  • 可能重复: 是传递const std::string的天数 如果支持移动语义学,我应该通过值传递d::字符串吗?那么使用小字符串优化(SSO)的实现呢?

  • 本文向大家介绍JavaScript 通过引用或值传递参数,包括了JavaScript 通过引用或值传递参数的使用技巧和注意事项,需要的朋友参考一下 示例 在JavaScript中,所有参数均按值传递。当函数将新值分配给参数变量时,该更改将对调用者不可见: 但是,对此类参数的(嵌套)属性所做的更改对调用者将是可见的: 这可以看作是通过引用进行的调用:尽管函数无法通过为其分配新值来更改调用者的对象,但

  • 问题内容: 该程序给出6作为输出,但是当我取消注释第9行时,输出为5。为什么?我认为ba不应更改,主要应保持5。 问题答案: 在Java中传递对象时,它们将作为in 方法中引用的参考含义对象和method 中的参数传递,它们都指向同一对象,因此,当您将值更改为6时,它将反映在方法中。 现在,当您尝试执行此操作时,您将指向另一个对象,但仍指向您在方法中创建的对象,因此更新的值6在main方法中不可见

  • 问题内容: 我的代码: 为什么不引用元素? Python:除非明确复制,否则所有内容都将作为参考传递[这不是True吗?] 请说明.. python如何确定 引用和复制 ? 更新: 怎么做 ? locs必须包含最终处理后的响应! 我不想使用,没有它可能吗? 问题答案: Python中的所有内容都是通过值传递和分配的,与Java中的所有值都传递和分配的方式相同。Python中的每个值都是对对象的引用

  • 问题内容: 有任何想法吗?2天后仍然卡住。 问题答案: 将的结果分配给变量,然后将该变量传递给: 问题是,这需要引用,因为它修改了数组的内部表示(即,它使 当前元素指针 指向最后一个元素)。 的结果不能转换为参考。这是PHP语言的一种限制,出于简化的原因可能存在。

  • 问题内容: 我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。 通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递? 问题答案: Swift中的事物类型 规则是: 类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 ) 函数是参考类型 其他一切都是 价值类型 ; “其他所有内容”仅表示