コピーコンストラクタ

//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についてデストラクタが呼ばれる。
}

コピーコンストラクタで初期化される場合もあるので、気を付けること。

もちろん、この場合もデストラクタは呼ばれる。