是否可以重载加法运算符(+)以添加数组?就像是:
double operator+ (double a[], double b[])
{
double c[];
c[] = a[] + b[];
return c;
}
是否可以重载加法运算符(+)以添加数组?就像是:
double operator+ (double a[], double b[])
{
double c[];
c[] = a[] + b[];
return c;
}
不。
在编译时将“T 数组”类型的参数调整为“指向 T 的指针”,因此您的声明:
double operator+ (double a[], double b[])
真正意思:
double operator+ (double *a, double *b)
而且你不能operator+
为指针类型定义重载(至少 gcc 不这么认为,我相信它是正确的)。
你也不能声明一个以数组类型作为返回类型的函数;如果你尝试,它没有调整为指针类型,它只是非法的。
您可以定义接受某些容器类型 ( std::vector
, std::array
) 的参数的函数——无论如何这可能更有用。
一定要考虑operator+
如果左右操作数的大小不同,你应该怎么做。(抛出异常是一种合理的方法。)
您不能重载采用非类类型操作数的全局运算符。幸运的是,我们可以使用std::vector<T>
(属于类类型):
#include <vector>
#include <algorithm>
#include <iostream>
template <typename T>
std::vector<T> operator +(std::vector<T> lhs, std::vector<T> rhs)
{
std::vector<T> temp;
temp.insert(temp.end(), lhs.begin(), lhs.end());
temp.insert(temp.end(), rhs.begin(), rhs.end());
return temp;
}
int main()
{
std::vector<int> x{1, 2, 3}, y{4, 5, 6};
std::vector<int> z(x + y);
for (auto a : z)
std::cout << a << ' '; // 1 2 3 4 5 6
}
这是一个演示。
不,你不能。但是你可以用这种方式编写一个包装数组的类:
#include <iostream>
#include <algorithm>
class Array {
int* arr;
int arr_size;
public:
Array(int n): arr(new int[n]), arr_size(n) {}
~Array(){ delete[] arr; }
int& operator[](int n) { return arr[n]; }
Array operator+(Array& other) {
Array to_return(arr_size);
for(int i=0 ; i < std::min(arr_size, other.arr_size) ; i++)
to_return[i] = arr[i] + other[i];
return to_return;
}
};
int main() {
int tmp1[] = {1, 2, 3, 4};
int tmp2[] = {5, 6, 7, 8};
Array arr(4), arr2(4);
for(int i=0 ; i < 4 ; i++) {
arr[i] = tmp1[i];
arr2[i] = tmp2[i];
}
for(int i=0 ; i < 4 ; i++)
std::cout << (arr + arr2)[i] << ' ';
return 0;
}
输出:
6 8 10 12
不是直接的。原则上,您可以编写采用(引用)数组的函数:
// returns a[0]*b[0] + a[1]*b[1] + ... + a[N-1]*b[N-1]
template <int N>
double innerProduct(double const (& a)[N], double const (& b)[N])
{
double sum = 0;
for (size_t i = 0; i < N; ++i) sum += a[i] * b[i];
return sum;
}
但是有几个问题:
operator+
为内置类型重载(或任何其他运算符),只有在至少一个参数是用户定义的情况下才能这样做(数组不是这种情况)。参见例如http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=256。因此,要么将数组包装在用户定义的类型中,要么使用常规函数(如addInto
)。对于返回值,要么将要填充的结果数组作为参数传递,要么返回其他类型,如std::vector
.
例子:
// c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; ... c[N-1]=a[N-1]+b[N-1];
template <int N>
void addInto(double const (& a)[N], double const (& b)[N], double (& out)[N])
{
for (size_t i = 0; i < N; ++i) out[i] = a[i] + b[i];
}
可以为您编写的类重载任何运算符。请记住,运算符重载只是为了使代码更具可读性,如果您的运算符所做的事情不是很明显,您可能应该重载它。同样对于这个特定的,您认为您可能必须为数组编写自己的包装类。您不能直接重载它,因为operator +
已经为指针定义了。您可以operator +
在 C++ 中重载向量或数组数据类型