11#include " Header.h"
22#include < algorithm>
33valarri::valarri (const std::initializer_list<int >& ilist)
4- :_cap {std::min (MAX_SIZE, ilist.size ())} // _cap的初值要取二者最小值
4+ : _cap {std::min (MAX_SIZE, ilist.size ())} // _cap的初值要取二者最小值
55{
66 std::size_t counter {0 }; // 长度计数器,用来防止超过MAX_SIZE
77 for (int x : ilist) { // 范围for循环,遍历ilist中的每个数
8- operator [](_size++) = x; // 这里可以用operator[](int)成员函数来访问
8+ operator [](_size++) = x; // 注意自增是前缀还是后缀,请读者自行分析
99 if (++counter >= MAX_SIZE) // 说明达到MAX_SIZE了
1010 break ; // 直接退出for循环
1111 }
@@ -19,17 +19,31 @@ valarri::valarri(int n, std::size_t size)
1919 _object_number++; // 计数器自增
2020}
2121valarri::valarri (const valarri &a) // 拷贝构造函数应当进行深拷贝,切记!
22- :_cap{a._cap },
23- _size{a._size }
22+ : _cap {a._cap },
23+ _size {a._size }
2424{ // 这里不用防_cap超过MAX_SIZE,因为其它部分共同保证了a._cap不会超过MAX_SIZE
25- for (int i = 0 ; i < _size; i++)
25+ for (std:: size_t i = 0 ; i < _size; i++)
2626 operator [](i) = a[i]; // 拷贝每个值,而不是拷贝地址
2727 _object_number++; // 计数器自增
2828}
2929valarri::~valarri () {
3030 _object_number--; // 计数器自减
3131 delete[] _arr.p (); // 回收_arr.p()指向的动态内存空间,注意必须要用delete[]搭配
3232}
33+ valarri::valarri (const vecint &vec) // vecint到valarri的转换构造函数
34+ : _cap {vec.size ()}, // valarri的成员对vec私有成员无访问权限,所以要用其公有成员
35+ _size {vec.size ()}
36+ {
37+ for (std::size_t i = 0 ; i < _size; i++)
38+ operator [](i) = vec[i]; // vecint也有重载下标运算符,并且有常成员函数的重载
39+ _object_number++; // 计数器自增
40+ }
41+ valarri::operator vecint ()const { // valarri到vecint的自定义转换函数
42+ vecint vec (_size); // 调用了vecint的构造函数,直接指定vec的大小
43+ for (std::size_t i = 0 ; i < _size; i++)
44+ vec[i] = operator [](i); // 逐个赋值,不要用push_back成员,反复重分配太浪费
45+ return vec;
46+ }
3347valarri& valarri::operator =(const valarri &a) { // 直接赋值运算符
3448 if (&a == this ) // 防范自我赋值
3549 return *this ;
@@ -44,19 +58,19 @@ valarri& valarri::operator=(const valarri &a) { //直接赋值运算符
4458}
4559valarri valarri::operator +(const valarri &a)const {
4660 valarri v (0 ,std::min (_cap,a._cap )); // 用构造函数为v初始化,代码重用
47- for (int i=0 ; i < v._size ; i++)
61+ for (std:: size_t i=0 ; i < v._size ; i++)
4862 v[i] = operator [](i) + a[i];
4963 return v;
5064}
5165valarri valarri::operator +(int n)const {
5266 valarri v {*this }; // 用拷贝构造函数为v初始化,也是代码重用
53- for (int i = 0 ; i < v._size ; i++)
67+ for (std:: size_t i = 0 ; i < v._size ; i++)
5468 v[i] = operator [](i) + n;
5569 return v;
5670}
5771valarri operator +(int n,const valarri &a) { // 这是非成员函数,它是valarri的友元
5872 valarri v {a}; // 同样是拷贝构造函数
59- for (int i = 0 ; i < v._size ; i++)
73+ for (std:: size_t i = 0 ; i < v._size ; i++)
6074 v[i] = a[i] + n;
6175 return v;
6276}
@@ -83,27 +97,27 @@ void valarri::resize(std::size_t size, int value) { //改变数据容量
8397 if (size > MAX_SIZE) // 防止size超过MAX_SIZE
8498 size = MAX_SIZE;
8599 valarri v (value, size); // 注意用圆括号
86- for (int i = 0 ; i < std::min (_size, v._size ); i++) // 注意范围
100+ for (std:: size_t i = 0 ; i < std::min (_size, v._size ); i++) // 注意范围
87101 v[i] = operator [](i);
88102 swap (v); // 将此对象与v交换,这样v会指向旧的内存空间并在析构时销毁
89103}
90104int valarri::max ()const { // 返回值是数组当前的最大值
91105 int maximum {operator [](0 )};
92- for (int i = 1 ; i < _size; i++)
106+ for (std:: size_t i = 1 ; i < _size; i++) // 注意循环的结束条件用_size,下同
93107 if (maximum < operator [](i))
94108 maximum = operator [](i);
95109 return maximum;
96110}
97111int valarri::min ()const { // 返回值是数组当前的最小值
98112 int minimum {operator [](0 )};
99- for (int i = 1 ; i < _size; i++)
113+ for (std:: size_t i = 1 ; i < _size; i++)
100114 if (minimum > operator [](i))
101115 minimum = operator [](i);
102116 return minimum;
103117}
104118int valarri::sum ()const { // 返回值是当前数组中有效数据的总和
105119 int summation {0 }; // 先置为0
106- for (int i = 0 ; i < _size; i++) // 注意循环的结束条件应用_size而不是_cap
120+ for (std:: size_t i = 0 ; i < _size; i++)
107121 summation += operator [](i); // 然后把每个数都加到summation上
108122 return summation;
109123}
0 commit comments