24.12.05
[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:
- 画出对应的类图;
![image]()
2.提交源代码(用C++完成);
include
include
class Vector {
public:
// 构造函数
Vector(int size) : size(size) {
data = new double[size];
std::fill(data, data + size, 0.0);
}
// 拷贝构造函数(深克隆)
Vector(const Vector& other) : size(other.size) {
data = new double[size];
std::memcpy(data, other.data, size * sizeof(double));
}
// 浅克隆
Vector shallowClone() const {
Vector newVec(size);
newVec.data = this->data; //指针
return newVec;
}
// 深克隆
Vector deepClone() const {
return Vector(*this);
}
// 设置向量的值
void set(int index, double value) {
if (index >= 0 && index < size) {
data[index] = value;
}
}
// 获取向量的值
double get(int index) const {
if (index >= 0 && index < size) {
return data[index];
}
return 0.0;
}
// 获取向量大小
int getSize() const {
return size;
}
// 析构函数
~Vector() {
delete[] data;
}
private:
double* data;
int size;
};
int main() {
Vector v1(5);
v1.set(0, 1.0);
v1.set(1, 2.0);
// 深克隆
Vector v2 = v1.deepClone();
// 浅克隆
Vector v3 = v1.shallowClone();
std::cout << "v1: " << v1.get(0) << ", " << v1.get(1) << std::endl;
std::cout << "v2: " << v2.get(0) << ", " << v2.get(1) << std::endl;
std::cout << "v3: " << v3.get(0) << ", " << v3.get(1) << std::endl;
// 修改 v1 的值
v1.set(0, 10.0);
std::cout << "After modifying v1:" << std::endl;
std::cout << "v1: " << v1.get(0) << ", " << v1.get(1) << std::endl;
std::cout << "v2: " << v2.get(0) << ", " << v2.get(1) << std::endl; // v2 不受影响
std::cout << "v3: " << v3.get(0) << ", " << v3.get(1) << std::endl; // v3 也不受影响
return 0;
}
3.注意编程规范。


浙公网安备 33010602011771号