请设计一个动态向量模板类DVector,包括以下功能:1.实现构造函数与拷贝控制函数 2.重载运算符+和*,定义为两向量之和与两向量之积,输出结果也是向量。 3.重载输出流运算符<<
时间: 2024-02-19 12:03:48 浏览: 23
以下是一个简单的动态向量模板类DVector的设计:
```c++
#include <iostream>
#include <vector>
template <typename T>
class DVector {
public:
// 构造函数
DVector() : size_(0), data_(nullptr) {}
DVector(size_t n) : size_(n), data_(new T[n]) {}
DVector(const DVector& other) : size_(other.size_), data_(new T[other.size_]) {
std::copy(other.data_, other.data_ + other.size_, data_);
}
DVector(DVector&& other) : size_(other.size_), data_(other.data_) {
other.size_ = 0;
other.data_ = nullptr;
}
// 析构函数
~DVector() {
delete[] data_;
}
// 拷贝赋值运算符
DVector& operator=(const DVector& other) {
if (this != &other) {
delete[] data_;
size_ = other.size_;
data_ = new T[size_];
std::copy(other.data_, other.data_ + other.size_, data_);
}
return *this;
}
// 移动赋值运算符
DVector& operator=(DVector&& other) {
if (this != &other) {
delete[] data_;
size_ = other.size_;
data_ = other.data_;
other.size_ = 0;
other.data_ = nullptr;
}
return *this;
}
// 重载运算符+
DVector operator+(const DVector& other) const {
if (size_ != other.size_) {
throw std::invalid_argument("Size mismatch!");
}
DVector result(size_);
for (size_t i = 0; i < size_; ++i) {
result.data_[i] = data_[i] + other.data_[i];
}
return result;
}
// 重载运算符*
DVector operator*(const DVector& other) const {
if (size_ != other.size_) {
throw std::invalid_argument("Size mismatch!");
}
DVector result(size_);
for (size_t i = 0; i < size_; ++i) {
result.data_[i] = data_[i] * other.data_[i];
}
return result;
}
// 重载输出流运算符<<
friend std::ostream& operator<<(std::ostream& os, const DVector& v) {
os << "[";
for (size_t i = 0; i < v.size_; ++i) {
os << v.data_[i];
if (i != v.size_ - 1) {
os << ", ";
}
}
os << "]";
return os;
}
private:
size_t size_;
T* data_;
};
```
使用示例:
```c++
int main() {
DVector<int> v1(3);
v1[0] = 1;
v1[1] = 2;
v1[2] = 3;
std::cout << "v1: " << v1 << std::endl;
DVector<int> v2(3);
v2[0] = 4;
v2[1] = 5;
v2[2] = 6;
std::cout << "v2: " << v2 << std::endl;
DVector<int> v3 = v1 + v2;
std::cout << "v1 + v2: " << v3 << std::endl;
DVector<int> v4 = v1 * v2;
std::cout << "v1 * v2: " << v4 << std::endl;
return 0;
}
```