Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内联函数和复制构造函数_C++_C++11 - Fatal编程技术网

C++ 内联函数和复制构造函数

C++ 内联函数和复制构造函数,c++,c++11,C++,C++11,这两个内联函数之间有什么区别 inline void setValue(ClassName& value); vs inline void setValue(ClassName value); 基本上,编译器将如何处理这两种情况g++/MSComp 类似的情况,但具有基本体: inline void setValue(const float value); inline void setValue(float& value); inline void setValue(flo

这两个内联函数之间有什么区别

inline void setValue(ClassName& value);
vs

inline void setValue(ClassName value);
基本上,编译器将如何处理这两种情况g++/MSComp

类似的情况,但具有基本体:

inline void setValue(const float value);
inline void setValue(float& value);
inline void setValue(float value);

第二个内联不会更改原始对象的值,因为它将首先被复制,而复制对象的值将被更改


对于基元类型,只有引用一(第二个)可以更改
基元。

第二个内联不会更改原始对象的值,因为它将首先被复制,而复制对象的值将被更改


对于基元类型,只有引用1(第2个)可以更改
基元。

内联
主要是一个链接器指令,因此在这里没有任何区别w.r.t.参数传递。安全地忽略这一点

void setValue(ClassName& value);
通过引用获取传入对象,从而编辑实际传入对象,而

void setValue(ClassName value);
按值获取它,因此使用原始对象的副本。对此局部变量所做的更改对于调用方传入的参数来说无关紧要


对于内置(原语)类型,按引用和按值传递的含义也保持不变。这两个变量<代码>无效设置值(浮动值)
无效设置值(常量浮点值)
对调用方没有什么意义,因为您无论如何都在复制值,对于调用方来说,
const
并不重要,尽管在函数的实现站点上,它不允许对复制的本地
值进行意外编辑,因为它是函数中的
常量。

主要是一个链接器指令,因此在这里没有任何区别。参数传递。安全地忽略这一点

void setValue(ClassName& value);
通过引用获取传入对象,从而编辑实际传入对象,而

void setValue(ClassName value);
按值获取它,因此使用原始对象的副本。对此局部变量所做的更改对于调用方传入的参数来说无关紧要

对于内置(原语)类型,按引用和按值传递的含义也保持不变。这两个变量<代码>无效设置值(浮动值)
无效设置值(常量浮点值)对调用者来说没有什么意义,因为你无论如何都在复制值,对于调用者来说,
常量
并不重要,尽管在函数的实现站点上,它不允许对复制的本地
进行意外编辑,因为它位于函数中。

您的评论:

让我们说速度是最重要的,我不想复制构造函数在任何时候被调用。我会选择哪种方法

当然是那个不带拷贝的!使用引用,即使它是常量并且您不想更改参数对象。有些情况下,现代编译器会避免复制。谈到移动构造函数/赋值运算符实现的实现,您可能会感兴趣。

您的评论:

让我们说速度是最重要的,我不想复制构造函数在任何时候被调用。我会选择哪种方法


当然是那个不带拷贝的!使用引用,即使它是常量并且您不想更改参数对象。有些情况下,现代编译器会避免复制。谈到移动构造函数/赋值运算符实现的实现,您可能会感兴趣。

@DieterLücking我曾经想过,但通常这些编译器的事情会根据代码的复杂性而变化,所以我想我会在堆栈上问你们。您的问题与
内联
有什么特别的关系??对于
ClassName
的使用,非
inline
定义有什么不同吗?请详细说明,就目前而言,这个问题对我来说毫无意义…@DieterLücking让我们说速度是最重要的,我不想复制构造函数来随时调用。我会选择哪种方法?事实上,我希望编译器使用我传入的确切变量作为对象,它将作为函数的参数,在本例中,它将被放入调用者中。@πάνταῥεῖ 我只是想确认一下。非常感谢。我必须在多次反对票中幸存下来:(@mk1我应该做一个答案,你会接受吗?)…@DieterLücking我在想这个问题,但通常这些编译器的事情会根据代码的复杂程度而变化,所以我想我会问你们堆栈上的人。你们的问题和
内联
有什么特别的关系??对于
ClassName
的使用,非
inline
定义有什么不同吗?请详细说明,就目前而言,这个问题对我来说毫无意义…@DieterLücking让我们说速度是最重要的,我不想复制构造函数来随时调用。我会选择哪种方法?事实上,我希望编译器使用我传入的确切变量作为对象,它将作为函数的参数,在本例中,它将被放入调用者中。@πάνταῥεῖ 我只是想确认一下。非常感谢。必须通过多次否决票才能获得该tho:(@mk1我应该做出这样的回答吗,你会接受吗?;)…“第二次内联不会改变值”是的,会的!无论是否内联…我指的是原始对象,因为它会被复制。这个问题和这个问题不匹配,所以我猜测他想理解通过引用传递还是通过值传递。@FilipeGonçalves是的,但这与本案例中的结果或问题无关!答案已经增强,声明原始值没有更改。“第二个内联不会更改值”是的,它会!无论是否内联…我指的是原始对象,因为它会被复制。问题和问题不匹配,