C++实现Vector类模板

本文详细描述了一个C++模板类Vector的实现,包括构造函数、拷贝构造函数、cout输出重载、下标访问重载以及赋值操作符重载,旨在支持int、char、float、double以及自定义类元素的管理。
摘要由CSDN通过智能技术生成

题目 

 请设计一个数组模板类( 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++中的一种重要特性,可以让程序员自定义类的行为,使得代码更加灵活和易于理解。

  • 20
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值