一、支持 数组类模板 存储的 自定义类
1、可拷贝和可打印的自定义类
在上一篇博客 中 , 定义了 可拷贝 与 可打印 的 自定义类 Student , 可以被存放到 数组类模板 中 ;
由于其 成员变量 char m_name[32] 是 数组类型 , 创建时就直接分配了内存空间 , 即使浅拷贝也可以完成对 该类型对象的 拷贝工作 ;
代码语言:javascript复制class Student
{
friend ostream& operator<<(ostream& out, const Student& s);
public:
Student(){
m_age = 10;
strcpy(m_name, "NULL");
}
Student(const char* name, int age) {
strcpy(this->m_name, name);
this->m_age = age;
}
void printT() {
cout << "name : " << m_name << " , age : " << m_age << endl;
}
private:
char m_name[32];
int m_age;
};
// 重载左移运算符实现
ostream& operator<<(ostream& out, const Student& s) {
out << "name : " << s.m_name << " , age : " << s.m_age << " ; ";
return out;
}
2、改进方向
本篇博客中 , 开始讨论 自定义类 中是 char* 类型指针的情况 , 这里涉及到了 堆内存分配 以及 深拷贝 问题 ;
如果将上述 Student 类中的 char m_name[32] 数组成员 , 改为 char* m_name 指针成员 ;
那么需要进行 堆内存管理 ,
- 在 构造函数中 分配堆内存 ;
- 在 析构函数中 释放堆内存 ;
为了避免 浅拷贝 问题出现 , 需要
- 进行 等号 = 运算符重载 ;
- 以及 重写 拷贝构造函数 ;
为了使用 cout 打印该 类对象 , 需要 进行 左移 << 运算符重载 ;
3、改进方向 - 构造函数
在类的 无参构造函数 和 有参构造函数中 ,
使用 new 关键字 , 自动在堆内存中分配内存 , 然后为 堆内存 中的空间赋值 ;
代码语言:javascript复制 Student(){
m_age = 10;
// 创建一个数组个数为 1 的数组, 存放 '