C++(学习) —— 析构函数,运算符重载练习(MyVector类)

设计一个容器类MyVector来管理和动态存储n个整型数,并能支持完成以下代码调用的相应功能:
MyVector va; //定义一个空容器
MyVector vb(10);//定义了10个整数的容器,没有初值
MyVector vc(12,1);//定义了12个整数的容器,初值为1
MyVector vd(vc);//以已知容器创建新容器
va.pushback(5);//末尾增加一个值为5的元素va.display();//输出容器的各元素值
(加)通过取分量运算符直接访问/修改容器内的元素。

起初思考利用new直接申请动态空间int,后来在实现pushback()的功能的时候发现难以将新申请的动态内存空间与之前的练习起来,所以改用了链表实现。

//MyVector.h
#pragma once
class Node                    //定义节点
{
 public:
  int a;
  int order;
  Node* next=nullptr;
  
  Node();
  Node(int value);

};
class MyVector       	    //定义容器
{
 public:
  MyVector(int number=0);
  MyVector(int number,int defvalue);
  MyVector(const MyVector& copy);
  void pushback(int defvalue);
  void display();
  int& operator[](int index);
  int size();
  ~MyVector();
  
 private:
  Node* pNext=nullptr;
  Node* pFirst=nullptr;
  int length=0;
};

函数成员实现如下:

//MyVector.cpp
#include<iostream>
#include "MyVector.h"
using namespace std;

/*Node 类的构造函数,传参情况*/
Node::Node(int value)
{
 a = value;
 order = 0;
}

/*未初始化的构造函数,不传参情况*/
Node::Node(){}

/*无初值情况,定义一个无初值容器*/
MyVector::MyVector(int number){
 for (int i = 0; i < number; i++) {
  if (i == 0) {
  	 pFirst = pNext = new  Node;
  	 pNext->order = i;
  }
  else{
   pNext->next = new Node;
   pNext = pNext->next;
   pNext->order = i;
  }
 }
 length = number;
}

/*有初值情况*/
MyVector::MyVector(int number, int defvalue)
{
 for (int i = 0; i < number; i++) {
  if (i == 0) {
   	pFirst = pNext = new  Node(defvalue);
   	pNext->order = i;
  }         //记录首指针
  else {
   pNext->next = new Node(defvalue);
   pNext = pNext->next;
   pNext->order = i;
  }
 }
 length = number;
}

/*拷贝构造的情况*/
MyVector::MyVector(const MyVector& copy)
{
 Node* ptr = copy.pFirst;
 length = copy.length;
 for (int i = 0; i < length; i++) {
  if (i == 0) {
  	 pFirst = pNext = new  Node(ptr->a);          //记录首指针
  	 pNext->order = i;
  }
  else {
   pNext->next = new Node(ptr->a);
   pNext = pNext->next;
   pNext->order = i;
  }
  ptr = ptr->next;
 }
}

/*末尾增加一个值为 value 的元素*/
void MyVector::pushback(int value)
{
 pNext->next = new Node(value);
 pNext = pNext->next;
 pNext->order = length;
 length++;
}

/*打印整个的值*/
void MyVector::display()
{
 Node* ptr = pFirst;
 while (ptr) {
  cout << ptr->a << " ";
  ptr = ptr->next;
 }
 cout << endl;
}

/*取分量操作符的重载*/
int& MyVector::operator[] (int index)
{
 if (index<0 || index>=length)
 	 cout << "超出范围" << endl;
 else {
  Node* ptr = pFirst;
  for (int i = 0; i < length; i++) {
   if (index == (ptr->order))
   	 return ptr->a;
  ptr = ptr->next;
  }
 }
}

/*返回容器长度*/
int MyVector::size()
{
 return length;
}

/*析构,删除申请的空间*/
MyVector::~MyVector()
{
 Node* ptr = pFirst;
 while (ptr)
 {
  ptr = ptr->next;
  delete pFirst;
  pFirst = ptr;
 }
 cout << "Over!" << endl;
}

测试部分如下:

#include <iostream>
#include"MyVector.h"
using namespace std;

int main()
{
 MyVector vc(12, 1);
 vc.display();
 
 MyVector vd(10);
 vd.display();

 MyVector ve(vc);
 ve.display();
 
 ve.pushback(89);
 ve.pushback(99);
 ve.display();
 
 cout << "改变第6个的值为95" << endl;
 ve[5] = 95;
 cout << "第6个元素为:" << ve[5] << endl;

 for (int i = 0; i < ve.size(); i++) {
  cout << "第"<<i+1<<"个元素为:" << ve[i] << endl;
  
 MyVector vf;
 vf.display();

return 0;
 }
 

运行测试结果如下:
结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值