如何创建一个在c ++中将一个数组复制到另一个数组的运算符

时间:2011-08-15 20:07:56

标签: c++ arrays operator-overloading

我需要创建一个将一个数组中的内容复制到另一个数组的运算符。 A.K.A是一个平等的运营商。我正在思考这些问题:

    operator=(string array[10][10], string array2[10][10])
    {
        int row = 0; int column = 0;
        for(column=0; column<=9; column++)
        {
            for(row=0; row<=9; row++){
                array2[row][column]=array[row][column];
            }
        }
    }

我只是不确定运算符声明的语法哪个是我的问题。即使我将上面显示的代码弄错了,我也知道如何制作内部代码。我只是不确定如何写“operator =(string ....)”

2 个答案:

答案 0 :(得分:9)

你做不到。有两个原因

  • 数组是内置类型,仅当至少有一个参数是用户定义类型时才允许运算符重载
  • operator =是4个运算符之一(以及[],()和 - &gt;),它们必须是为 1 <重载的类的成员/ SUP>。数组不是类。

你能做的是

  • 有一个命名函数而不是运算符

  • 将数组包装到类

  • 使用已经有作业的vector<vector<string> >&lt; - 我的投票在这里

1 至于为什么这些必须是成员,你可以看到我的这个问题:Rationale of enforcing some operators to be members

答案 1 :(得分:1)

除非其中一个参数属于类类型(或者运算符是模板),否则不能在C ++中重载运算符。这是有道理的,因为否则你可以做疯狂的事情,比如在整数上重新定义内置+运算符来做减法:

int operator+ (int lhs, int rhs) { // Not legal
    return lhs - rhs; // Whoops!
}

对于你正在做的事情,你试图重新定义operator =对数组的意义,这是不允许的。而且,这不是一个好主意,因为如果要成功它会违反最小惊喜原则,因为你会制作这样的代码,通常是非法的突然编译:

string array[10][10], string array2[10][10];
array = array2; // Problem; this isn't legal C++ code!

如果要支持数组深度复制,则需要编写自己的函数来执行此操作,而不是重载的赋值运算符。或者,也许是一个更好的想法,你应该考虑将数组包装在类或结构中。然后,您可以在该类或结构上重载operator =以执行深层复制。除此之外,您还可以获得额外的好处,即可以阻止人们在无效索引处访问数组,因为您可以定义检查索引的getter和setter。

希望这有帮助!