马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 bin554385863 于 2019-11-19 22:56 编辑
这是我对照C++string写的一个数字串的类
重载的加号是用来拼接的,不知道为啥会出现数字溢出,
numbers.h#ifndef NUMBERS_H
#define NUMBERS_H
#include <iostream>
#include <initializer_list>
template <typename tp>
class numbers
{
private:
tp *NUM;
size_t LENGTH;
public:
numbers(const tp *carray, size_t sz);//数组构造
numbers() : LENGTH(0), NUM(nullptr) {} //默认构造*****
numbers(std::initializer_list<tp> list); //普通构造*****
numbers(numbers<tp> &arr); //复制构造*****
void pushback(const tp data); //尾部插入元素*****
size_t size(); //数字串的大小*****
tp &operator[](const size_t i); //重载索引下标符号[]*****
size_t find(tp num); //在对象中查找一个元素,返回索引*****
bool find(numbers<tp> &nums); //在对象中查找另一个对象,返回bool值*****
numbers<tp> operator+(numbers<tp>& nums);//拼接
numbers<tp> operator-(numbers<tp>& nums);//删除于第二个对象相同的元素
numbers<tp> operator-(tp num);//删除与num相同的元素
friend std::ostream &operator<<(std::ostream &os, numbers<tp> &arr)
//重载输出流符号<<
{
for (size_t i = 0; i < arr.size(); i++)
{
os << arr[i];
}
return os;
}
//析构函数
~numbers();
};
#endif
numbers.cpp#include "numbers.h"
template <typename tp>
numbers<tp>::numbers(const tp *carray, size_t sz) : LENGTH(sz) //数组构造
{
NUM = new tp[LENGTH]{0};
for (size_t i = 0; i < LENGTH; i++)
{
*(NUM + i) = carray[i];
}
}
template <typename tp>
numbers<tp>::numbers(std::initializer_list<tp> list) : LENGTH(list.size())
//普通构造
{
NUM = new tp[LENGTH];
for (size_t i = 0; i < LENGTH; i++)
{
NUM[i] = *(list.begin() + i);
}
}
template <typename tp>
numbers<tp>::numbers(numbers<tp> &arr) //复制构造
{
LENGTH = arr.LENGTH;
NUM = new tp[LENGTH];
for (size_t i = 0; i < LENGTH; i++)
{
*(NUM + i) = arr[i];
}
}
template <typename tp>
void numbers<tp>::pushback(const tp data) //尾部插入元素
{
tp *t_NUM = new tp[LENGTH + 1];
for (size_t i = 0; i < LENGTH; i++)
{
t_NUM[i] = NUM[i];
}
t_NUM[LENGTH] = data;
LENGTH += 1;
delete[] NUM;
NUM = t_NUM;
}
template <typename tp>
size_t numbers<tp>::size() //取得对象的大小
{
return LENGTH;
}
template <typename tp>
tp &numbers<tp>::operator[](const size_t i) //重载索引符[]
{
return NUM[i];
}
template <typename tp>
size_t numbers<tp>::find(const tp num) //在对象里查找元素num是否存在
//如果存在则返回出现的次数,否则返回0
{
size_t count = 0;
for (size_t i = 0; i < LENGTH; i++)
{
if (num == NUM[i])
{
count++;
}
}
return count;
}
template <typename tp>
bool numbers<tp>::find(numbers<tp> &nums) //查找子对象的元素是否存在于父对象中
{
bool flag = true;
if (nums.LENGTH > LENGTH)
{
flag = false;
}
else
{
unsigned int count = 1;
for (size_t i = 0; i < nums.LENGTH; i++)
{
if (this->find(nums.NUM[i]))
{
count++;
}
else
{
flag = false;
break;
}
}
if (count == nums.LENGTH)
{
flag = true;
}
}
return flag;
}
template <typename tp>
numbers<tp> numbers<tp>::operator+(numbers<tp>& nums)
{
numbers<tp> result(NUM, LENGTH);
for (size_t i = 0; i < nums.size(); i++)
{
result.pushback(nums[i]);
}
std::cout<<result;
return result;//在这里已经拼接成功
}
template <typename tp>
numbers<tp>::~numbers() //析构函数
{
delete[] NUM;
}
int main(int argc, char const *argv[])
{
int arr[4] = {1, 2, 3, 4};
numbers<int> nums(arr, 4);
numbers<int> a = {5, 6, 7};
numbers<int> b;
b = a+nums;
std::cout<<b;//这里输出乱码
return 0;
}
你不写,编译器的确会为你写一个,但是编译器为你写的这个版本是进行浅拷贝,在这里必须进行深拷贝
所以这里不能用编译器的默认版本,你必须提供你自己的版本
|