题目
请设计一个数组模板类( Vector ),完成对int、char、float、double
以及任意的自定义类等类型元素进行管理。
需求:
a.实现构造函数
b.实现拷贝构造函数
c.实现cout << 操作
d.实现下标访问符[] 的重载操作
e.实现 = 号操作符重载
一.代码
//本质就是要复刻一个STL模板
//要实现vector容器,必须用到模板类
template <typename T>
class Vector
{
//现在内部任何数据类型必须使用T
//c.实现cout << 操作
//cout<<a<<b<<c;
friend ostream& operator<< <T>(ostream& out, const Vector& object);
public:
//a.实现构造函数
Vector(int size);
//b.实现拷贝构造函数
Vector(const Vector& object);
//d.实现下标访问符[] 的重载操作
//Vector<int> a1, a2; a1[0]
T& operator[](int index);
//实现=操作符重载
//a1 = a2 = a3;
Vector& operator=(const Vector& object);
~Vector(); //析构函数
private:
T* m_base;//这是Vector实现动态数组的关键
int m_len;
};
template <typename T>
Vector<T>::Vector(int size) { //构造函数
if (size > 0) {
m_len = size;
m_base = new T[m_len];
}
}
//b.实现拷贝构造函数
template <typename T>
//实现对数据的拷贝
Vector<T>::Vector(const Vector& object)
{
// 根据传入的对象元素个数分配空间
m_len = object.m_len;
m_base = new T[m_len];
//数据的拷贝
for (int i = 0; i < m_len; i++) {
m_base[i] = object.m_base[i];
}
}
//c.实现cout << 操作
template<typename T>
ostream& operator<<(ostream& out, const Vector<T>& object) {
for (int i = 0; i < object.m_len; i++) {
out << object.m_base[i] << " ";
}
out << endl;
return out;
}
//d.实现下标访问符[] 的重载操作
//Vector<int> a1, a2; a1[0]
template <typename T>
T& Vector<T>::operator[](int index)
{
return m_base[index];// return *(m_base+index);//这时m_base已经分配好空间了
}
//实现=操作符重载
//a1 = a2 = a3;
template <typename T>
//这里的等号被重定义了,
Vector<T>& Vector<T>::operator=(const Vector& object)
{
//将原来的内容全部删除,等待接收object的数据
if (m_base != NULL) {
delete[] m_base;
m_base = NULL;
m_len = 0;
}
//根据传入的对象元素个数分配空间
m_len = object.m_len;
m_base = new T[m_len];
//数据的拷贝
for (int i = 0; i < m_len; i++) {
m_base[i] = object.m_base[i];
}
return *this; // 返回当前的Vector
}
template <typename T>
Vector<T>::~Vector() //析构函数
{
if (m_base != NULL) {
delete[] m_base;
m_base = NULL;
m_len = 0;
}
}
问题1:指针的操作方式和数组是一样的吗?
在某种程度上,指针的操作方式和数组的操作方式是相同的。指针可以被用来访问数组元素,因为数组名本身就是一个指向数组第一个元素的指针。通过对指针进行递增或递减操作,可以访问数组中的不同元素。
然而,指针和数组之间也有一些重要的区别。指针是一个变量,可以指向任何内存地址,而数组是一个固定大小的连续内存块。指针可以指向不同的内存位置,而数组的大小是固定的。
另外,指针可以进行算术运算,例如递增、递减、加法和减法操作,而数组名不能进行算术运算。指针还可以通过解引用操作来访问指向的内存位置的值,而数组名本身就是一个指向数组第一个元素的指针,不需要解引用操作。
总的来说,指针和数组在某些方面是相似的,但在其他方面有重要的区别。在编程中,理解指针和数组的区别和相似之处是非常重要的。
问题2.运算符重载是不是 重新定义符号的作用
是的,C++中的符号重载(operator overloading)是指在类中重新定义某些运算符的行为。通过符号重载,可以使得某个运算符在不同情况下具有不同的行为,从而提高代码的灵活性和可读性。符号重载实际上就是重新定义符号的作用,让其具有不同的功能。例如,可以重载"+"运算符来实现类对象的相加操作,或者重载"<<"运算符来实现类对象的输出操作等。符号重载是C++中的一种重要特性,可以让程序员自定义类的行为,使得代码更加灵活和易于理解。