【C++】値渡し・参照渡しについて

C/C++

本日もC++のお話です(・∀・)
ロックマン開発における時事ネタという事で、よろしくお願いいたします。

C++における「値渡し」と「参照渡し」、これは挙動・パフォーマンス・安全性・意図の明確さすべてに関わる基本にして奥深い概念です。

分かりやすく整理していきますね!👇


✅ 基本の用語

用語説明
値渡し(pass by value)関数にコピーを渡す(元の変数は変更されない)
参照渡し(pass by reference)関数に元の変数への参照を渡す(元を変更できる)
const参照(const reference)参照を渡すが、読み取り専用にする

🔧 コードで理解する!

● 値渡し(コピーされる)

void ChangeValue(int x)
{
    x = 100;  // コピーしただけなので外には影響しない
}

int main()
{
    int a = 5;
    ChangeValue(a);
    // a == 5 のまま!
}

● 参照渡し(変更が元に反映される)

void ChangeValue(int& x)
{
    x = 100;
}

int main()
{
    int a = 5;
    ChangeValue(a);
    // a == 100 になる!
}

● const参照渡し(安全に高速)

void PrintName(const std::wstring& name)
{
    std::wcout << name;
}

PrintName(L"Nanase");  // コピーされないので高速

🧠 いつどれを使うべき?

パターンおすすめ渡し方理由
基本型(int, float)値渡し(コピー)軽いので問題なし
大きな構造体やstd::stringconst参照コピーコストが高いから
元の値を変更したい非const参照(int&など)書き換えたい意図が明確になる
可変状態の一部を共有したい参照 or ポインタ同じオブジェクトを共有するなら参照

🧨 よくある落とし穴

❌ コピーによって参照が切れる

struct A { int& ref; };
int x = 10;
A a1 = { x };
A a2 = a1;  // ここで a2.ref は「a1.ref のコピーされた参照」→ 危険

➡ 参照メンバを持つ構造体はコピー禁止にしておくのが安全。


✅ const参照は万能ツール

void DoSomething(const SomeBigStruct& data);  // 速い、変更されない、安全
  • 大きなオブジェクトには必須
  • ムーブ不可の型でも安全
  • 値渡しより 高速で意図が明確

✅ 比較まとめ

渡し方コピーされる?変更できる?安全性用途例
int x✅ される❌ できない基本型など軽い値
int& x❌ されない✅ できる変数を書き換えたい時
const int& x❌ されない❌ できない大きな構造体の読み取り

✨ 結論(ポイント)

  • 軽い型(int, float)は値渡し
  • 大きい型(std::vector, std::string)はconst参照
  • 関数内で値を変えたいなら参照(&)
  • 参照メンバのある構造体はコピー禁止 or 参照渡し限定

次回もお楽しみに~(・∀・)ノシ

コメント

タイトルとURLをコピーしました