コンストラクタとnewについてよくわかりません.
下のコードを実行したところ,
class CClass1 {
public:
CClass1(){
cout << "CClass1 co" << endl;
}
~CClass1(){
cout << "CClass1 de" << endl;
}
void func(){return;}
int v,u;
static const int c=5;
};
class CClass2 {
public:
void* operator new(size_t t){return 0;}
void operator delete(void* p){}
CClass2(){
cout << "CClass2 co" << endl;
}
~CClass2(){
cout << "CClass2 de" << endl;
}
};
int main(void){
CClass1 c1;
CClass2 c2;
cout << "1" << endl;
CClass1* pc1 = new CClass1;
CClass2* pc2 = new CClass2;
cout << "2" << endl;
CClass1* pc3 = new CClass1();
CClass2* pc4 = new CClass2();
cout << "3" << endl;
delete pc1;
delete pc2;
return 0;
}
CClass1 constractor
CClass2 co
1
CClass1 constractor
2
CClass1 constractor
3
CClass1 destractor
このことから,newでコンストラクタが呼ばれていると推測できます.
さらに,下のコードを実行したところ
char buffer[500];
class CClass2 {
public:
void* operator new(size_t t){return &buffer;}
void operator delete(void* p){}
CClass2(){
cout << "CClass2 co" << endl;
}
~CClass2(){
cout << "CClass2 de" << endl;
}
int i;
int j;
};
int main(void){
CClass2 c2;
cout << "1" << endl;
CClass2* pc2 = new CClass2;
cout << "2" << endl;
printf("&buffer, &pc2, &(pc2->i), &(pc2->j) = %p %p %p %p\n",&buffer, pc2, &(pc2->i), &(pc2->j) );
delete pc2;
int i; cin >> i;
return 0;
}
CClass2 co
1
CClass2 co
2
&buffer, &pc2, &(pc2->i), &(pc2->j) = 00E90218 00E90218 00E90218 00E9021C
CClass2 de
このことから,任意の場所に確保することも出来ると推測できます.
(プレースメントnewというものもあるということをこの後知りました.)
ここで疑問なのですが
-
new CClass2()
は,結局は
{
malloc( sizeof(CClass2) );
このmallocで返る位置の後続にメンバ変数などを順におく;
コンストラクタに書かれている処理;
}
と同義なのでしょうか?それ以外の働きはありますか?
コンストラクタと,コンストラクタをnewで動的に呼んだときに何が起こるのか教えてください. -
もしそうなら,メンバ関数やstatic constにした定数,スーパークラス,サブクラスのそれらといった,
複数のインスタンスで使い回されるものはメモリのどこに確保されるのですか? - +, -, sizeof, new, delete はなぜわざわざ「関数」とは別の「演算子」という定義がされているのですか?