C++ Vector 类重载 += 运算符的优化
您的代码中进行了一些修改,但是存在一些问题。首先,在成员函数 operator+= 的定义中,应该将它声明为非常量成员函数,因为它会修改当前对象的状态。其次,在进行向量累加时,应该使用当前对象的 data 成员,而不是 data 成员的 size。此外,您可以通过抛出异常来处理向量维度不匹配的情况,而不是简单地输出错误信息。
以下是修正后的代码示例:
#include <iostream>
#include <cmath>
#include <stdexcept>
class Vector {
public:
// 构造函数
Vector(int dim) : size(dim), data(new double[size]) {}
// 拷贝构造函数
Vector(const Vector& other) : size(other.size), data(new double[size]) {
for (int i = 0; i < size; i++) {
data[i] = other.data[i];
}
}
// 析构函数
~Vector() {
delete[] data;
}
// 重载 [] 运算符以允许访问向量元素
double& operator[](int index) {
if (index >= 0 && index < size) {
return data[index];
} else {
throw std::out_of_range('Index out of range');
}
}
// 重载 const 版本的 [] 运算符,以允许在常量对象上访问元素
const double& operator[](int index) const {
if (index >= 0 && index < size) {
return data[index];
} else {
throw std::out_of_range('Index out of range');
}
}
// 重载 += 运算符,实现向量的累加
Vector& operator+=(const Vector& other) {
if (size != other.size) {
throw std::invalid_argument('Vector sizes are not equal');
}
for (int i = 0; i < size; i++) {
data[i] += other.data[i];
}
return *this;
}
// 获取向量模长
double getMagnitude() const {
double sum = 0.0;
for (int i = 0; i < size; i++) {
sum += data[i] * data[i];
}
return std::sqrt(sum);
}
// 输出向量内容
void print() const {
std::cout << 'Vector: ( ';
for (int i = 0; i < size - 1; i++) {
std::cout << data[i] << ', ';
}
std::cout << data[size - 1] << ' )' << std::endl;
}
private:
double* data;
int size;
};
// 重载 + 运算符,实现向量相加
Vector operator+(const Vector& v1, const Vector& v2) {
Vector result(v1);
result += v2;
return result;
}
int main() {
// 创建两个向量对象
Vector v1(3);
Vector v2(3);
// 设置向量元素的值
v1[0] = 1;
v1[1] = 2;
v1[2] = 3;
v2[0] = 4;
v2[1] = 5;
v2[2] = 6;
// 输出向量内容
v1.print();
v2.print();
// 进行向量加法
Vector sum = v1 + v2;
sum.print();
// 进行向量累加
v1 += v2;
v1.print();
return 0;
}
现在,这个示例中的向量类可以进行向量的累加操作,并处理向量维度不匹配的情况。您可以根据需要修改和扩展该类,以满足您的具体需求。
原文地址: https://www.cveoy.top/t/topic/b6dl 著作权归作者所有。请勿转载和采集!