2016-08-16 7 views
1

少しばかげた質問ですが、なぜですか?コンストラクタでconstへの参照を使用したいのはなぜですか?

Constructorでローカル文字列を宣言するのではなく、const stringへの参照を使用したいのはなぜですか?

class Person (const string &first_name, const string &last_name); 
class Person (string first_name, string last_name); 

私はこのように自動変数への参照を取得していますか? o_O

ありがとうございました!

+0

これはあまりコードです。しかし、実際にはユースケースに依存します。 – NathanOliver

+0

一般的な関数に値を渡して引数を渡すのと比べて、引数を渡すことと変わりありません。このトピックに関する情報は不足していません。 – SergeyA

+1

'first_name'と' last_name'がオブジェクトに格納される場合、コードを単純化しながら*効率的*であるため、2番目の(つまり非const *非ref *)バージョン*を優先します。それは直感的ではないように思えますが、慎重に考えれば、それは実際に効率的であるとわかります。同時に、コードを簡素化します。 – Nawaz

答えて

-1

"背後で"何が起こるかのセマンティクスがかなり異なるためです。

class Person1 { 
    std::string f_name, l_name; 
public: 
    Person(std::string first_name, std::string last_name) : 
    f_name(first_name), l_name(last_name) { 
    } 
}; 

class Person2 { 
    std::string f_name, l_name; 
public: 
    Person(const std::string & first_name, const std::string & last_name) : 
    f_name(first_name), l_name(last_name) { 
    } 
}; 

あなたがPerson1のインスタンスを構築

は、名前は、それが二回コピーされます初期化するために使用される:最初のコンストラクタでローカル変数を開始すること、第二には、メンバ変数にコピーし、構築します。しかし、 Person2では、メンバー変数へのコピー構成が発生したときに1つのコピーしか発生しません。

このような単純な例では、これがパフォーマンスとメモリの重要な意味を表すことは明らかではないかもしれませんが、より複雑なプログラムでは、これはかなり重要な意味を持ちます。

+0

Person1の変数代入でst :: moveを使用すると、それらのコストはほぼ同じになります(Person1とPerson2) – Amadeus

+0

ありがとうございます!十分にクリア!どうもありがとうございました! – user3027198

+0

@Amadeus Trueですが、Copy-Construct-> Move-AssignのコストはおそらくCopy-Constructのコストよりも大きいでしょう。 – Xirema

関連する問題