C++11 では、場合によってはオブジェクトを値で渡し、他の場合は const-reference で渡すように案内されます。ただし、このガイドラインは、メソッドのインターフェースやクライアントによる使用目的だけでなく、メソッドの実装にも依存します。
インターフェイスを書くとき、それがどのように実装されるかわかりません。メソッド署名を書くための良い経験則はありますか? たとえば、次のコード フラグメントでは、 or を使用する必要がありますBar1
かBar2
?
class IFoo
{
public:
virtual void Bar1(std::string s) = 0;
virtual void Bar2(const std::string& s) = 0;
};
正しい署名が実装に依存することに同意する場合は、ここで読むのをやめてください。ここに、私がそう信じる理由を示す例があります。
次の例では、文字列を値で渡す必要があります。
class Foo
{
std::string bar;
Foo(std::string byValue)
: bar(std::move(byValue))
{
}
};
これで、すべてのケースで効率的な方法で Foo をインスタンス化できます。
Foo foo1("Hello world"); // create once, move once
Foo foo2(s); // the programmer wants to copy s. One copy and one move
Foo foo3(std::move(t)); // the programmer does not need t anymore. No copy at all
それ以外の場合は、const 参照によってオブジェクトを渡すことを好みます。たとえば、次の場合、引数をコピー/保存したくありません。そのメソッドを使用するだけです。
void DoStuff(const std::string& byRef)
{
std::cout << byRef.length() << std::endl;
}
上記の方法のすべての可能な使用法は、すでに可能な限り効率的です。
アップデート
const-reference の代替の問題を示すのを忘れていたと思います。上記のクラスFoo
がこのように実装されている場合:
class Foo
{
std::string bar;
Foo(const std::string& byRef)
: bar(byRef)
{
}
};
次に、次の結果が得られます。
Foo foo1("Hello world"); // Here we would have one more copy of the string. It is less efficient.
Foo foo2(s); // One copy, like before
Foo foo3(std::move(t)); // Irrelevant here.
アレックス。