24.12.05

[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:

  1. 画出对应的类图;
    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.注意编程规范。

posted @ 2024-12-05 19:24  起名字真难_qmz  阅读(7)  评论(0)    收藏  举报