カワサキの技術ブログ

エンジニア志望によるゆるゆる備忘録。

【C++】学習メモ:C++におけるクラスの書き方とJavaのそれ【Java】

はじめに

  • C++のクラスの学習で気になった(Javaと勝手が違う)ところをまとめてみました。
  • 『新・明解C++入門』の10〜11章のまとめです(メインは10章)。

クラスの書き方

基本的な書き方

class User {
    //データメンバ
    private:
        std::string name_;
        int age_;

    public:
        //コンストラクタ
        User(std::string name, int age){
            this->name_ = name;
            this->age_ = age;
        }

        //メンバ関数(ゲッタ)
        std::string name() { return name_; }
        int age() { return age_; }
    
};
  • アクセス指定子:を一度書けばまとめて適用できる(いちいち書かなくていい)。
  • アクセス指定子に何も指定しなければ自動的にprivate(非公開)になる。

ゲッタの書き方

  • 基本的には3種類存在する
    • データメンバ名に_を付ける(前のソースコードの書き方)。
    • データメンバとゲッタ名を変える。
    • ゲッタの先頭にget_をつける(Javaの書き方に似てる)。
  • 3つ目を使った関数は標準ライブラリには存在しない。

ヘッダ部とソース部の分割

  • メンバ関数の定義はクラス定義の外で行うことができる(非インライン関数)。
  • クラス利用者にとって、メンバ関数宣言は必要だが定義は必要ない
    メンバ関数の記述は分割するべき。
  • 具体的には、クラス実現の際には以下の2つに分ける。
    • クラス定義(データメンバやメンバ関数の宣言)を記述したヘッダ部
    • メンバ関数の定義を記述したソース部
  • なお、サンプルコードではゲッタはヘッダ部に記載されている。
  • クラス利用者はヘッダ部をインクルードしてクラスを利用する。
  • ヘッダでusing指令を行うと、インクルード先まで影響を与えてしまうため使用しない。

感想

クラスファイルをヘッダ部とソース部に分割するところがJavaと大きく異なる点で、面食らいました。 望洋本を要約しても理由がいまいち分からなかったので少し調べてみたところ、こちらのサイトを見つけました(プログラミングメモ - C++ のソースをヘッダと実装に分ける理由とか)。 利用者のコンパイルの有無が重要なポイントになっていそうですが、そんなものかという程度で理解しきれていません。 この点に関しては、学習を続けていき後日考察し直そうと思います(いつになるか分かりませんが)。

参考文献