本文主要介绍STL的容器值(value)语意。所有容器提供的都是值语意,而非引用语意。容器执行插入元素操作时,内部实施copy工作。所以STL容器存储的元素必须能够被copy,即必须提供copy构造函数。下面以一个示例来说明这一点。在示例中,定义了一个类对象,若使用容器(vector)存入该对象,容器内部会将该对象复制一份到容器中,这就要求对象具有copy的能力而不会发生内存泄漏或空指针现象。具体看下面示例代码:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include "vector"
using namespace std;
class Teacher
{
public:
Teacher(char *name,int age)
{
m_p = new char[strlen(name)+1];
strcpy(m_p,name);
m_age = age;
}
~Teacher()
{
if (m_p != NULL)
{
delete [] m_p;
m_p = NULL;
m_age = 0;
}
}
Teacher(const Teacher &obj)
{
m_p = new char[strlen(obj.m_p)+1];
strcpy(m_p,obj.m_p);
m_age = obj.m_age;
}
// 重载=操作符 t3=t2=t1
Teacher& operator=(const Teacher &obj)
{
// 先把t2的旧的内存释放掉
if (m_p != NULL)
{
delete [] m_p;
m_p = NULL;
m_age = 0;
}
// 根据t1 de 大小分配内存
m_p = new char[strlen(obj.m_p)+1];
strcpy(m_p,obj.m_p);
m_age = obj.m_age;
return *this;
}
public:
void printT()
{
cout << m_p << "\t" << m_age << endl;
}
protected:
public:
char *m_p;
int m_age;
};
void main01()
{
Teacher t1("t1",31);
t1.printT();
vector<Teacher> v1;
v1.push_back(t1);//将t1复制一份到容器中,这是需要考虑对象是否需要copy构造函数
for (vector<Teacher>::iterator it = v1.begin();it != v1.end();it++ )
{
cout << it->m_age << " ";
}
cout << endl;
}
void main()
{
main01();
cout << "hello..."<< endl;
system("pause");
}