const の参照

( →_→)アクセス!


今度は const と参照を組み合わせてみよう。

int value = 0; int const &ref = value; // いろいろしてみる int read = ref; // OK、読み込める ref = 2; // NG、書き込めない

このように、const な変数への参照 という扱いになる。

他の変数から値を読み取るだけ の場合に、コピーを防ぐときに使う感じ。

#include <string> std::string add_quote(std::string const& message) { return "「" + message + "」"; // ここでは複製される } std::string add_quote_copy(std::string message) { // ここで複製されて return "「" + message + "」"; // 更にここで複製される } #include <iostream> int main() { std::string text = "abc"; { std::string quote_text = add_quote(text); // text は複製されない std::cout << quote_text << "\n"; } { std::string quote_text = add_quote_copy(text); // text は複製される std::cout << quote_text << "\n"; } }

この例は一回しかコピーが起こらないので大した違いはないけど、

大量のデータを扱い始めると問題が顕現してくる。

ただし、int みたいな小さいサイズのを const& で渡してもあんまり美味しくない。

  • 参照型のサイズ (大抵 unsigned long と同じ) より大きいサイズのもの
  • 複製する必要がないのにコピーすると遅いもの

とかにはよく効く。