本日も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::string | const参照 | コピーコストが高いから |
元の値を変更したい | 非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 参照渡し限定
次回もお楽しみに~(・∀・)ノシ
コメント