#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
template <class T>
class A;
template <class T>
ostream &operator<<(ostream &out, const A<T>&obj);
template <class T>
class A{
public:
A(int i):data(i){}
friend ostream& operator<< <>(ostream &out, const A<T>&obj);
private:
T data;
};
template <class T>
ostream &operator<<(ostream &out, const A<T>&obj)
{
out<<obj.data;
return out;
}
class String{
public:
//构造函数
String(const char* str = NULL){
if(str == NULL){
m_data = new char[1];
m_data[0]='\0';
}else{
int length = strlen(str);
m_data = new char[length];
strcpy(m_data, str);
}
}
//析构函数
~String(void){
delete[] m_data;
}
//拷贝构造函数
String(const String &other){
if(other.m_data == NULL){
m_data = new char[1];
m_data[0]='\0';
}else{
int length = strlen(other.m_data);
m_data = new char[length];
strcpy(m_data, other.m_data);
}
}
//赋值函数
String operator=(const String &other){
//自检
if(this == &other){
return *this;
}
delete []m_data;
if(other.m_data == NULL){
m_data = new char[1];
m_data[0]='\0';
}else{
int length = strlen(other.m_data);
m_data = new char[length];
strcpy(m_data, other.m_data);
}
return *this;
}
friend ostream &operator<<(ostream &os, const String &s);
private:
char *m_data;
};
//重载输出
ostream &operator<<(ostream &os, const String &s){
os<<s.m_data;
return os;
}
int main()
{
//模板类重载操作符
A<int>a(2);
cout<<a<<endl;
//自实现String,包含构造函数,析构函数,拷贝构造函数,赋值函数。
//重载操作符
String s1("hello");
String s2 = s1;
cout<<s2<<endl;
return 0;
}