C ++では、次のような宣言が表示されることがあります。
return_type function_name( datatype parameter1, datatype parameter2 ) const
{ /*................*/}
この場合、このconst型修飾子は正確に何をしますか?
C ++では、次のような宣言が表示されることがあります。
return_type function_name( datatype parameter1, datatype parameter2 ) const
{ /*................*/}
この場合、このconst型修飾子は正確に何をしますか?
メンバー関数宣言の最後にあるconst修飾子は、それ自体がconstであるオブジェクトに対して関数を呼び出すことができることを示します。constメンバー関数は、変更不可能なデータメンバーの状態を変更しないことを約束します。
もちろん、constメンバー関数は、非constオブジェクトで呼び出すこともできます(それでも同じ約束をします)。
メンバー関数は、const-nessでもオーバーロードされる可能性があります。例えば:
class A {
public:
A(int val) : mValue(val) {}
int value() const { return mValue; }
void value(int newVal) { mValue = newVal; }
private:
int mValue;
};
A obj1(1);
const A obj2(2);
obj1.value(3); // okay
obj2.value(3); // Forbidden--can't call non-const function on const object
obj1.value(obj2.value()); // Calls non-const on obj1 after calling const on obj2
$ 9.3.1/3の状態-
「非静的メンバー関数は、const、volatile、またはconst volatileとして宣言できます。これらのcvqualifierは、このポインター(9.3.2)のタイプに影響します。メンバー関数の関数タイプ(8.3.5)にも影響します。メンバー関数宣言されたconstはconstメンバー関数であり、volatileで宣言されたメンバー関数はvolatileメンバー関数であり、constvolatileで宣言されたメンバー関数はconstvolatileメンバー関数です。」
要約は次のとおりです。
a)const修飾子は、クラスの非静的メンバー関数にのみ使用できます
b)関数のcv資格はオーバーロードに参加します
struct X{
int x;
void f() const{
cout << typeid(this).name();
// this->x = 2; // error
}
void f(){
cout << typeid(this).name();
this->x = 2; // ok
}
};
int main(){
X x;
x.f(); // Calls non const version as const qualification is required
// to match parameter to argument for the const version
X const xc;
xc.f(); // Calls const version as this is an exact match (identity
// conversion)
}
これは、オブジェクトを変更しないことを意味するため、constオブジェクトを使用してそのメソッドを呼び出すことができます。
すなわち
class MyClass {
public:
int ConvertToInteger() const;
};
あなたが持っているならそれを意味します
const MyClass myClass;
あなたは呼び出すことができます
int cValue = myClass.ConvertToInteger();
メソッド宣言はオブジェクトのデータを変更しないことを示しているため、コンパイルエラーは発生しません。