2016-04-02 7 views
2

定数を定義するのがベストプラクティスですか?ここで小さな例がある:明らかにすべての定数をconst参照として定義しますか?

#include <vector> 

struct mystruct { 
    std::vector<double> data; 
    mystruct() : data(100000000,0) {}; 
}; 

int main(){ 
    mystruct A; 
    int answer = 42; 

    const mystruct& use_struct_option_1 = A; // quick 
    const mystruct use_struct_option_2 = A; // expensive 

    const int& use_answer_option_1 = answer; // good practice? 
    const int use_answer_option_2 = answer; // ubiquitous 
} 

use_struct_option_1を初期化する方法が迅速であるのに対し、mystructのコピーコンストラクタが呼び出されるので、その方法は高価であるuse_struct_option_2を初期化します。 しかし、整数などの型にも同じことが当てはまりますか?私は

const int use_answer_option_2 = answer; 

は、はるかに一般的なものであることが好ましい

const int& use_answer_option_1 = answer; 

よりであることを伝えることができますでロックされたコードから

+1

'int'の場合、オプション1は定数値を生成しません。それは 'use_answer_option_1'という名前では変更できない値ですが、誰でも' answer = 21; 'を使って参照が参照するものを変更することができます。それがあなたが望むものかどうかを判断しなければなりません。構造と同様に;あなたはあなたの「一定の参照」によって参照されるデータを変更する人に気をつけますか?それが重要であれば、データスペースに800 MiBを追加したとしてもコピーが必要です。それが重要でない場合、非定数データへの定数参照はOKです。 –

答えて

2

これらは異なるものです。たとえば、intの場合:

answer = 43; 
cout << use_answer_option_1 << '\n';  // 43 
cout << use_answer_option_2 << '\n';  // 42 

つまり、オプション2はコピーを作成し、オプション1は作成しません。

コピーを作成するかどうか(つまり、元のイニシャライザの変更を参照に反映させるかどうか)を決定します。 mystructのケースは同じです。

関連する問題