lnt-make-member-function-const
メンバー関数がオブジェクトの状態を変更しない場合は、const
キーワードを使用して注釈を付けます。 このガイダンスの出典は、「C++ Core Guideline Con.2」です。
例
次のコードにはリンターによってフラグが 2 回設定されます。getValue()
と getRadius()
がオブジェクトの状態を変更しないためです。
class MyClass
{
public:
int getValue() { return value; } // Flagged: ‘getValue’ doesn't modify the object's state.
void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state.
private:
int value = 42;
};
double getRadius()
{ // Flagged: ‘getRadius’ doesn't modify the object's state.
return radius;
}
問題を解決する方法
メンバー関数がオブジェクトの状態を変更しない場合は、const
とマークします。 これにより、コードのリーダーとコンパイラは、const
オブジェクトに対して関数を呼び出しても安全であることを認識できます。
次の例では、const
が getValue()
と getRadius()
に追加されています。
class MyClass
{
public:
int getValue() const { return value; } // Added const
void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state.
private:
int value = 42;
};
double getRadius() const // added const
{ // ‘getRadius’ doesn't modify the object's state.
return radius;
}
エディターでこの変更を加えることができます。 フラグが設定されたシンボルにカーソルを置き、[考えられる修正内容を表示する]、次に [メンバーを const にする] を選択します。
カーソルは int getValue() の行にあり、**[考えられる修正内容を表示する]** が表示されて選択されました。 次に、**[メンバーを const にする]** が表示され、const が追加された getValue関数が表示されます。 これで、**[メンバーを const にする]** を選択して変更を加えることができます。
フラグが設定されたメンバー関数すべてに対してこの変更を行います。
解説
Visual Studio 2022 17.8 で導入されたこのチェックは、C++ コードのメンバー関数での const
の使用に焦点を合わせたものです。 C++ Core Guidelines では、メンバー関数がオブジェクトの状態を変更しない場合は const
とマークすることを勧めています。
このチェックの現在の実装では、メンバー関数の宣言後に const
を追加できます。 オブジェクトの状態を変更しない場合は、メンバー関数を最初から const
と宣言することをお勧めします。