これはエラーです:
error: static member function ‘static void myClass::myfunct()’ cannot have cv-qualifier
誰かがこのエラーとconstを使用できない理由を説明してください。
#include<iostream>
class myClass{
static void myfunct() const
{
//do something
}
};
int main()
{
//some code
return 0;
}
回答:
回答№1の33ここで標準を引用する価値がある
9.4.1静的メンバー関数
2)[注:静的メンバー関数にはthisポインターがありません(9.3.2)。 —注を終了] A
static
メンバー 機能はvirtual
。あってはならないstatic
および非static
を持つメンバー関数 同じ名前と同じパラメータータイプ(13.1)。静的メンバー関数は宣言されません
const
,volatile
、またはconst volatile
.
static
機能はありません this
パラメータ。 cv修飾子は必要ありません。
見る この ジェームズ・マクネリスによる回答
あなたが適用するとき
const
非静的メンバー関数の修飾子、 それは影響しますthis
ポインター。 const修飾メンバー関数の場合 クラスのC
、this
ポインターはタイプですC const*
、に対して const修飾されていないメンバー関数、this
ポインタは タイプC*
.
回答№2の10
A static
メンバー関数はそのクラスのインスタンスにバインドされていないため、それが意味をなさない const
および/または volatile
(つまり、「cv-qualified」)。これは、 const
または volatile
その関数を呼び出す際に適用できます。
回答№3の場合は3
書くのは理にかなっていない const
そこには、関数が static
したがって、吹き込むクラスインスタンスはありません const
コンテキスト。したがって、エラーとして扱われます。
回答№4の場合は1
メンバー関数宣言の修飾子constクラスthisのオブジェクトへのポインターに適用されます。静的関数はクラスのオブジェクトにバインドされていないため、暗黙的なパラメーターthisはありません。したがって、修飾子constはこれらの関数に対して意味を持ちません。
回答№5の場合は1
メンバー関数のconst修飾子は、この関数はオブジェクトインスタンスを変更せず、constオブジェクトで呼び出すことができます。静的メンバー関数はオブジェクトインスタンスにバインドされていないため、オブジェクトに対して静的メンバー関数を呼び出さないため、constには意味がありません。これが標準で禁止されている理由です。
class Foo
{
public:
void memberFunc();
static void staticMemberFunc();
}
Foo f;
f.memberFunc(); // called on an object instance
Foo::staticMemberFunc(); // not called on an object instance