4

今日、私は「これ」のタイプについて何か奇妙なことに気づきました。あなたがこのようなものを持っているなら:

class C {
    void funcA() {
        funcB(this);
    }

    void funcB(C obj) {
        //do something
    }
};

funcB()はオブジェクトを予期しているのに対し、'this'はポインターであるため、もちろんエラーが発生します。誤ってアスタリスクを忘れてしまいましたが、次のようなエラーメッセージに驚いていました。

no matching function for call to 'C::funcB(C* const)'

funcA()が一定でない場合、constはどこから来ますか?

4

5 に答える 5

9

つまり、thisポインタ自体const-つまり、別のメモリを指すようにポインタを変更することはできません。

C ++のごく初期の歴史に戻るnewと、オーバーロードする前delete、または新しい配置が発明される前thisは、非コンストラクターポインターでした(少なくともctor内)。独自のメモリ管理を処理したいクラスは、コンストラクター内のインスタンスにスペースを割り当て、コンストラクターをthis終了する前にそのメモリのアドレスを書き込むことによってそれを行いました。

constメンバー関数では、処理する型はになります。これは、ポイントするものが(およびポインター自体が)でClass const *const thisあることを意味します。thisconstconst

于 2013-01-17T16:37:34.940 に答える
8

C* constCタイプのオブジェクトが定数であることを意味するものではありません。それはC const*またはconst C*です。

C* constポインタ自体が一定であることを意味します。

あなたができないので、それは理にかなっています

this = &something_else;
于 2013-01-17T16:37:17.937 に答える
4

C const *ではないことに注意してくださいC* const。つまり(右から左に読む)定数ポインタC

于 2013-01-17T16:37:17.093 に答える
4

との間には違いがC const*ありC * constます。違いを理解する必要があります。

  • C const*定数であるのはオブジェクト(ポインタが指す)であることを意味します。
  • C * const定数であるのはポインタ自体であることを意味します。

したがってthis、定義上、C * const型のポインタであるため、それが指すオブジェクトは変更できますが、変更することはできません。

于 2013-01-17T16:37:58.267 に答える
3

ポインタ自体は定数であり、ポイントされたデータではありません。

于 2013-01-17T16:38:51.650 に答える