メンバ変数¶
クラスとは変数と関数を集約した型をつくるための仕組みです。
クラスが持つ変数をメンバ変数といいます。
長方形を扱う Rectangle クラスに
int 型のメンバ変数 height と width を持たせるには次のようにします。
class Rectangle { public: int height_; int width_; };
メンバ変数を参照するには . を使用します。
Rectangle r; r.height_ = 10; r.width_ = 20;
クラスのオブジェクトをポインタで扱う場合に、メンバ変数を参照するには次のようにします。
Rectangle rectangle; Rectangle* r = &rectangle; (*r).height_ = 10; (*r).width_ = 20;
括弧をつけずに *r.height_ とすると意味が変わってコンパイルエラーとなります。
この記述方法は不便なため (*r). の代わりに r-> と記述することができます。
Rectangle rectangle; Rectangle* r = &rectangle; r->height_ = 10; r->width_ = 20;
コンパイルエラーになる理由
演算子の優先順位が原因です。
演算子には優先順位があります。
たとえば加算 + と乗算 * では乗算 * を優先することになっているため、
1 + 2 * 3 は 1 + (2 * 3) と解釈されて結果は 7 になります。
(1 + 2) * 3) の結果である 9 にはなりません。
デリファレンスの * とメンバ変数参照の . では
メンバ変数参照の . を優先することになっているため、
*r.height_ は *(r.height_) と解釈されます。
しかしながら r の型である std::unique_ptr<Rectangle> には
height_ というメンバ変数はないためコンパイルエラーとなります。
詳細は C++の演算子の優先順位 - cppreference.com を参照してください。