ことれいのもり

C++で関数の引数にconstをつけるべきか迷ったら読んでほしい記事

はじめに

C++で関数を書くとき、引数にconstをつけたりつけなかったりしますよね。

どういうときにつけて、どういうときにつけないの?という基準は人によって違うと思います。

この記事では、私なりの考え方を紹介します。

その値を変更したくないときにconstをつけよう

結論を述べると、「引数の値を変更したくないとき」にconstをつけるべきです。


次のコードを見てください。

これは、モデル・テクスチャー・位置・回転・スケールの情報を元にオブジェクトを生成する関数です。


void EditorViewport::AddFBXModelObject(const FilePath& modelPath, const FilePath& texturePath, const Vec3& pos, const Quaternion& q, const Vec3& scale)
{
    auto newObject = GameObjectFactory::CreateFBXModelObject(modelPath, pos, texturePath);
    newObject->SetName(FileSystem::BaseName(modelPath));
    newObject->SetRotation(q);
    newObject->SetScale(scale);

    fbxModelObjects << newObject;

    gameObjectManager->AddEditorObject(newObject);
}


引数には全て「const」をつけています。

これは、絶対に関数内で値を変更してほしくないからです。


関数の役割を考えてみましょう。

この関数は「モデル・テクスチャー・位置・回転・スケールの情報を受け取ってセットする」役割です。

このとき、モデルのパスや位置の値を変えてほしくはないです。

参照で渡されているので、関数内で誤って値を変更してしまうと、呼び出し元の変数にも影響が出てしまいます。


逆にいうと、関数内で引数の値を使って処理を変えたり、書き換える場合はconstをつけない方が自然です。

「この引数は関数内でどう使うんだろうか?」を考えるとconstをつけるべきかどうか分かると思います!

頑張ってconstをつけてみよう

「constをつけなくても動作するから別につけなくても良くない?」と思う人もいるかもしれません。

確かに、constをつけなくても動きます。

しかし、constをつけておくと、別の人が見たときに「この値は変更しないんだな」「読み取り専用なんだな」とぱっと見て分かります。


でもなんかconstつけるの怖くないですか?

私にはその気持ち、わかります。


私は元々UnityでC#を使っていました。

C++でゲームを作り始めて、constがいろんな所にでてきてびっくりしています。

いろんなパターンがあってどれが正解なんだよ!と思いますよね。

でもそれに負けず、間違っていても良いからconstをつけてみましょう。

おかしかったらエラーが出ます。

だいじょうぶ!!

おわりに

この記事では、引数にconstをつけるときの私なりの基準を紹介しました。

同じようなconst初心者の参考になれば幸いです。