C++の定数メンバー関数

1419 ワード

C++では、クラスのメンバー関数のパラメータリストの直後にconstキーワードが続く場合、そのメンバー関数は定数メンバー関数です.次のようになります.
struct Sales_data { //     std::string bookNo; unsigned uints_sold = 0; double revenue = 0.0; //     std::string isbn() const { return bookNo; } //       Sales_data& combin(const Sales_data&); };

クラスのメンバー関数を呼び出すと、実際には特定のオブジェクトのメンバー関数が呼び出されます.メンバー関数は、thisという追加の暗黙的なパラメータによって呼び出されるオブジェクトです.すなわち、オブジェクトのメンバー関数を呼び出すと、thisポインタがオブジェクトにバインドされます.
メンバー関数の内部では、メンバー演算子で特定のオブジェクトを指定することなく、関数を呼び出すオブジェクトのメンバーを直接使用できます.これは、thisがこのオブジェクトを指しているためです.thisの目的は常に「これ」オブジェクトを指すため、thisは定数ポインタであり、thisが保存しているアドレス(保存しているアドレスは「これ」オブジェクトのアドレス)を変更することは許されません.
メンバー関数では、パラメータリストの後ろにあるconstキーで、暗黙的なthisポインタのタイプを変更します.前述したthisポインタは定数ポインタであり、保存されているアドレスは変更できません.すなわち、「これ」オブジェクトのみを指します.ただし、オブジェクトが定数オブジェクトとして宣言された場合、thisポインタは常に定数オブジェクトを指しますが、thisは定数を指すポインタではなく、定数ポインタにすぎません.言い換えれば、この定数オブジェクトをthisポインタで変更できるのは問題があるのではないでしょうか.
これは、定数オブジェクトの一般的な関数を呼び出すことができないことを意味します.これは、通常の関数の暗黙的なthis定数ポインタを、定数オブジェクトにバインドすることを意味します.キーワードconstの役割は、thisポインタを定数ポインタから定数オブジェクトを指す定数ポインタに変更することです.これにより、定数オブジェクトによって呼び出されます.
上記の分析から分かるように、
(1)定数メンバー関数パラメータリスト後のconstキーワードは,thisポインタが定数を指すことを意味する.
(2)定数メンバー関数は、呼び出されたオブジェクトを変更しません(thisポインタは定数へのポインタに変更されているため).
(3)非常量のオブジェクトは定数メンバー関数を呼び出すことができ、定数オブジェクトは定数メンバー関数のみを呼び出すことができ、通常のメンバー関数は呼び出されない(通常のメンバー関数が呼び出されたオブジェクトを変更しない場合でも).
参考:『C++primer』第5版