3
class A{
private:
    int a;
public:
    A() {a = 4;}
    const int& random1() const {return a; }
    //int&     random2() const {return a; }
    const int* random3() const {return &a;}
    //int*     random4() const {return &a;}
};

int main(){
    A objA;
    cout<<objA.random1()<<"\n";
    cout<<*objA.random3()<<"\n";
}

random2()random4()上記で定義されているように許可されていません。私はどういうわけかこれをずっと知っていましたが、今日まで、自分のコードを書いているときにこれに出くわすことはありませんでした。

これらの2つのケースを除いて、constメンバー関数で許可されていないものは何ですか?

C++標準テキストへの参照も役立ちます。ありがとう!

4

2 に答える 2

10

まず、それが変更できないものconst T*へのポインタであることを理解してください。T次に覚えておくべきことは、すべてのメンバーは実際にはを介してアクセスされるということthis->です。

だから(§9.3.1):

非静的メンバー関数は、const、volatile、またはconstvolatileとして宣言できます。これらのcvqualifiersは、thisポインターのタイプに影響を与えます(9.3.2)。

そしてそれが何をするか(§9.3.2):

非静的(9.3)メンバー関数の本体では、キーワードthisは非左辺値式であり、その値は関数が呼び出されるオブジェクトのアドレスです。クラスXのメンバー関数でのこのタイプはX*です。メンバー関数がconstと宣言されている場合、このタイプはconst X *であり、メンバー関数がvolatileと宣言されている場合、このタイプはvolatile X *であり、メンバー関数がconst volatileと宣言されている場合、このタイプはconstです。揮発性X*。

const関数のAはthisポインタを作りますconst T*

これが、これらの例が失敗する理由です。int&バリアントでaは、は、としてアクセスされthis->athisconst T*、としてアクセスされaますconst int。またconst int、暗黙的にに変換することはできませんint&。他の機能と同じです。

言い換えれば、関数がクラス内のすべてのものにconst影響constを与える場合、暗黙的にconst捨てることはできません。

于 2010-07-25T19:18:15.290 に答える
0

const メンバー関数は、メンバー データを変更しない場合でも、非 const メンバー関数を呼び出すことはできません。場合によっては、同じ関数の const バージョンと非 const バージョンの両方を提供する必要があります。これは、このポインターがメンバー関数に暗黙的に渡され、オーバーロードの解決に役割を果たすためです。

于 2010-07-26T13:09:06.173 に答える