如果把Teacher放入到MyVector数组中, 并且Teacher类的属性含有指针, 就出现深拷贝和浅拷贝的问题。
需要Teacher封装的函数有:
1) 重写拷贝构造函数
2) 重载等号操作符
3) 重载左移操作符。
//.h文件
#pragma once
#include<iostream>
using namespace std;
template<typename T>
class MyVector
{
public:
MyVector(int size);
//MyVector b = a;//拷贝构造函数
MyVector(const MyVector &obj);
MyVector();
~MyVector();
int getlen()
{
return length;
}
public:
//a[i] = i;//[]重载
T &operator[](int i);
//c = b;//=操作符重载
MyVector& operator=(MyVector&t);
//cout << c;//<<重载
friend ostream& operator<<<T>(ostream&out, MyVector&t);
private:
T *str;
int length;
};
#pragma once
#include"iostream"
using namespace std;
class Teacher
{
public:
Teacher();
Teacher(char *p ,int age);
Teacher(const Teacher &t);
~Teacher();
public:
Teacher & operator=(Teacher &t);
friend ostream& operator<<(ostream&out, Teacher&t);
private:
char *name;
int age;
};
//.cpp文件
#include "MyVector.h"
#include<iostream>
using namespace std;
template<typename T>
MyVector<T>::MyVector(int size)
{
length = size;
str = new T[size];
}
template<typename T>
MyVector<T>::MyVector()
{
}
template<typename T>
MyVector<T>::MyVector(const MyVector<T> &obj)
{
this->length = obj.length;
this->str = obj.str;
}
template<typename T>
MyVector<T>::~MyVector()
{
if (str != NULL)
{
delete str;
str = NULL;
length = 0;
}
}
template<typename T>
T &MyVector<T>::operator[](int i)
{
return str[i];
}
template<typename T>
MyVector<T>& MyVector<T>::operator=(MyVector<T>&t)
{ //先释放旧内存
if (str != NULL)
{
delete str;
str = NULL;
length = 0;
}
//开辟空间
length = t.length;
str = new T[length+1];
//copy数据
for (int i = 0; i < t.length; i++)
{
str[i] = t.str[i];
}
return *this;
}
template<typename T>
ostream& operator<<(ostream&out, MyVector<T>&t)
{
for (int i = 0; i < t.getlen(); i++)
{
out << t.str[i] << " ";
}
cout<< endl;
return out;
}
#define _CRT_SECURE_NO_WARNINGS
#include "Teacher.h"
#include"iostream"
using namespace std;
Teacher::Teacher()
{
age = 0;
name = new char[1];
strcpy(name, "");
}
Teacher::Teacher(char *p, int age)
{
this->age = age;
name = new char[strlen(p)+1];
strcpy(name, p);
}
Teacher::Teacher(const Teacher &t)
{
name = new char[strlen(t.name)+1];
strcpy(name, t.name);
age = t.age;
}
Teacher::~Teacher()
{
if (name != NULL)
{
delete [] name;
name = NULL;
age = 0;
}
}
ostream& operator<<(ostream&out, Teacher &t)
{
out << t.name << "," << t.age;
return out;
}
Teacher& Teacher::operator=(Teacher &t)
{
if (name != NULL)
{
delete[] name;
name = NULL;
age = 0;
}
name = new char[strlen(t.name)+1];
strcpy(name, t.name);
age = t.age;
return *this;
}
//main.cpp
#include"MyVector.cpp"
#include "Teacher.h"
#include<iostream>
using namespace std;
int main()
{
Teacher a1("js", 30), a2("zx", 31), a3("rm", 33);
MyVector<Teacher> a(3);
a[0] = a1;
a[1] = a2;
a[2] = a3;
MyVector<Teacher> b = a;
MyVector<Teacher> c;
c = b;
cout << c;
system("pause");
return 0;
}
int main01()
{
MyVector<int> a(10);
for (int i = 0; i < a.getlen(); i++)
{
a[i] = i;//[]重载
}
MyVector<int> b = a;//拷贝构造函数
MyVector<int> c;
c = b;//=操作符重载
cout << c;//<<重载
cout << a;
cout << b;
system("pause");
return 0;
}