[C++]構造体のコンストラクタとデストラクタと継承と初期化式


構造体のコンストラクタ

とりあえず単純なもの

まぁコード見たほうが早いよ。

struct Struct {
  int a;
  int b;
  Struct(){
    a = 123;
    b = 456;
  }
};
int main(int argc, char *argv[]) {
  struct Struct var;
  printf("%d, %d", var.a, var.b); // 123, 456
}

コンストラクタのオーバーロード や デフォルト引数

構造体はクラスなので可視性の指定やメソッドの定義も当然可能です。

struct Struct {
 private:
  int a;
  int b;

 public:
  Struct(int a, int b = 789) { // デフォルト引数
    this->a = a;
    this->b = b;
  }
  Struct(const char * str) {
    // コンストラクタの多重定義も可能
  }

  int getA(){ return a; }
  int getB(){ return b; }
};
int main(int argc, char *argv[]) {
  struct Struct var(456);
  printf("%d, %d", var.getA(), var.getB()); // 456, 789

   struct Struct error; // デフォルトコンストラクタが無いのでコンパイルエラー
}

構造体, 継承

構造体はクラスでございますので当然のごとく継承できるのです。(でも共用体はできなかった…)
継承する場合は virtualデストラクタが必要となるので注意。

class Class {};

struct Struct {
  virtual int method() { return 500; }
  virtual ~Struct() { printf("Struct#~Struct \n"); }
};

struct SubStruct : public Struct, public Class {
  // オーバーライド
  int method() { return 1000; }
  virtual ~SubStruct() { printf("SubStruct#~SubStruct \n"); }
};
int main(int argc, char *argv[]) {
  struct Struct *base = new Struct;
  struct Struct *sub = new SubStruct;
  printf("%d, %d \n", base->method(), sub->method());
  delete base;
  delete sub;
}

結果

500, 1000
Struct#~Struct
SubStruct#~SubStruct
Struct#~Struct

構造体の初期化式

コレについてもあんまり知らなかったので少し調べてみた。

struct Struct {
  int a;
  int b;
  int c;
};
int main(int argc, char *argv[]) {
  struct Struct var = {123, 456};
  printf("%d, %d, %d \n", var.a, var.b, var.c); // 123, 456, 0 (指定されなかった部分は 0 に初期化される)

  var = (struct Struct) {777, 888, 999}; // これはOK。でも下の方法は…
  var = {777, 888, 999}; // 初期化時にしか使えないためコンパイルエラーとなる。
                         // でもキャストしてやれば成功する(この場合は値のコピーとなり初期化とは違うけど)
}

この初期化式…どうやらコンストラクタが定義されている時にはこの初期化式は使えないらしい。

  1. コメントはまだありません。

  1. トラックバックはまだありません。

*


Advertisement