データメンバ¶
クラスとは変数と関数を集約した型をつくるための仕組みです。
クラスが持つ変数をデータメンバといいます。
メンバ変数
データメンバのことを俗にメンバ変数と呼ぶこともありますが、 C++ ではデータメンバという呼び方が正式な呼び方なので 本ドキュメントもそれに従います。
長方形を扱う 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 を参照してください。