コピーコンストラクタ
//AutoPtr.h #include <cstring> #include <iostream> class AutoPtr { private: char *ptr; public: AutoPtr(); ~AutoPtr(); char *operator=(char *ptr); operator char* (); char& operator[](int index); //深いコピー AutoPtr(AutoPtr& src); AutoPtr& operator=(AutoPtr& src); }; AutoPtr::AutoPtr() : ptr(0) { std::cout << "AutoPtr::AutoPtr()" << std::endl; } AutoPtr::~AutoPtr() { std::cout << "AutoPtr::~AutoPtr()" << std::endl; delete[] ptr; } char& AutoPtr::operator[](int index) { std::cout << "char& AutoPtr::operator[](int index)" << std::endl; return ptr[index]; } //AutoPtrを配列のようにキャスト AutoPtr::operator char* () { std::cout << "AutoPtr::operator char* ()" << std::endl; return ptr; } char* AutoPtr::operator=(char* ptr) { std::cout << "char* AutoPtr::operator=(char* ptr)" << std::endl; delete[] this->ptr; this->ptr = ptr; return this->ptr; } AutoPtr::AutoPtr(AutoPtr& src) { std::cout << "AutoPtr::AutoPtr(AutoPtr& src)" << std::endl; ptr = new char[strlen(src.ptr)+1]; strcpy(ptr, src.ptr); } AutoPtr& AutoPtr::operator=(AutoPtr& src) { std::cout << "AutoPtr& AutoPtr::operator=(AutoPtr& src)" << std::endl; delete[] ptr; ptr = new char[strlen(src.ptr)+1]; strcpy(ptr, src.ptr); return *this; } //main.cpp #include "AutoPtr.h" #include <cstdio> #include <cstring> void reverse(char* str); class C { public: C(int value) : mInt(value) { std::cout << "C(int value)" << std::endl; } ~C() { std::cout << "~C()" << std::endl; } C(C& m) { std::cout <<"C(C& m)" << std::endl; this->mInt = m.mInt; } private: int mInt; }; int main() { AutoPtr a,b; //生成コンストラクタ char s[] = "idohoiho"; a = new char[20]; //char* AutoPtr::operator=(char* ptr) strcpy(a, "test opeartor="); //AutoPtr::operator char* () b = a; //AutoPtr& AutoPtr::operator=(AutoPtr& src) AutoPtr c = a; //AutoPtr::AutoPtr(AutoPtr& src) コピーコンストラクタが呼ばれる。(注意) int num = 4; //C test0; //デフォルトコンストラクタは(もう1つ以上コンストラクタを作ってしまったので)呼び出されない。 C test1 = 4; //C(int value) コンストラクタ C test2 = num; //C(int value) あくまでtest2はnumで初期化されている。 C test3 = test2; //C(C& m) コピーコンストラクタ 浅いコピー //test1,test2についてデストラクタが呼ばれる。 //a,b,cについてデストラクタが呼ばれる。 }
コピーコンストラクタで初期化される場合もあるので、気を付けること。
もちろん、この場合もデストラクタは呼ばれる。