ためになるホームページ お問い合わせ




TOP > C++ > new演算子
new演算子
C++には、動的確保の演算子としてnew演算子が用意されている。
new演算子は、動的確保とコンストラクタの呼び出し(初期化)を行う。
Cの関数mallocは動的確保ができるが、コンストラクタの呼び出しは行われない。
newとmallocの例
#include <iostream>
using namespace std;

class CTest {
public:
  CTest() {
    cout << "Constructor " << endl;
  }
};
int 
main(int argc, char* argv[]) {

  CTest *test1 = new CTest();
  CTest *test2 = (CTest*)malloc(sizeof(CTest));
  delete test1;
  free(test2);
  return(0);
}


上記の例を実行すると"Constructor"は、一回しか呼ばれない事がわかる。

(書式) new type;
int型などの場合は、動的確保する時に、初期化をする事もできる。
(書式) new type(初期化値);
newの例
#include <iostream>
using namespace std;

int 
main(int argc, char* argv[]) {

  /// 動的確保を行う
  int *test1 = new int;
  
  /// 動的確保をし、1に初期化する
  int *test2 = new int(1);
  
  cout << *test2 << endl;
  
  delete test1;
  delete test2;
  return(0);
}


配列の確保
配列を確保するには、以下の書式を使う。
(書式) new type[size];
newで配列確保の例
#include <iostream>
using namespace std;

int 
main(int argc, char* argv[]) {

  /// int型10個を動的確保
  int *test1 = new int[10];
  
  int i;
  for ( i = 0; i < 10; i++) {
    test1[i] = i;
  }
  
  delete[] i;

  return(0);
}

newを使ってコンストラクタをもう一度呼び出す
new演算子を使って、コンストラクタをもう一度呼び出す事ができる。
(書式) new (void*)address type;

new使い方の例
#include <iostream>
using namespace std;

class CTest{
public:
  CTest() : m_a(0) {
    cout << "Default Constructor : m_a = " << m_a << endl; 
  }

  CTest(int a) : m_a(a) {
    cout << "OverLoad Constructor : m_a = " << m_a << endl;
  }
  int getParam(void){
    return(m_a);
  }
private:
  int m_a;
};

int 
main(int argc, char* argv[]) {
  CTest *p = new CTest();
  
  /// 同じオブジェクトに対して、引数ありのコンストラクタを呼び出す
  CTest *q = new ((void*)p) CTest(3);

  cout << "pointer p->m_a" << p->getParam() << endl;
  cout << "pointer q->m_a" << q->getParam() << endl;
  delete p;
  return(0);
}







Copyright 2007 ためになるホームページ All Rights Reserved.