Car*_*esi 1 c++ constructor pass-by-reference pass-by-value c++11
请考虑以下代码:
#include <iostream>
using namespace std;
class A {
public:
A() = default;
A(const A& rhs) {
cout << "Copy was made!" << endl;
}
};
class B {
public:
A data;
int foo;
B(A data, int foo) : data(data), foo(foo) {
}
};
int main() {
A data;
B foo(data, 10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印出:
复制了!
复制了!
是的,它是正确的,它复制两次!
当我们传递data
给B's
构造函数时,第一个副本发生.当我们data
从构造函数复制到memeber变量时,第二个副本就会发生.
我们知道我们不能复制1份(除非我们去heap & pointers
).那么为什么我们不总是写:
B (const A& data, const int& foo, const SomeOtherType& bar, const float& aFloatyNumber)
... 等等.
我知道通过值传递int,float等是很便宜的.但是,通过始终const ref
作为Constructor
参数,我们将减少1份副本.
如果你不移动你正在消耗的对象,你实际上应该通过引用传递你的参数,可能是作为一个T const&
.如果你确实使用了你的参数,你应该按值传递移动感知类型的对象(即,定义移动构造函数的类型)并移动它.也就是说,如果A
是移动感知,即有一个构造函数A::A(A&&)
,你可以使用:
B(A data, int foo) : data(std::move(data)), foo(foo) {
}
Run Code Online (Sandbox Code Playgroud)
如果您的类型不是移动感知的,或者您不需要从构造中挤出最后一点性能,或者类型是仅移动的,则可以安全地传递对象T const&
.
归档时间: |
|
查看次数: |
2586 次 |
最近记录: |