【问题标题】:how to create multiple operator overloading in c++ object oriented programming like obj[10]=3 with [] operator and = operator如何使用 [] 运算符和 = 运算符在 C++ 面向对象编程中创建多个运算符重载,例如 obj[10]=3
【发布时间】:2020-04-22 19:46:03
【问题描述】:

我有一个特定的类,我想创建 2 个可以一起工作的运算符

喜欢带数组的类,我想更改数组中的某个索引

喜欢这个 obj[3]=5

这可能吗? 如果是,怎么做?

这是我为 [] 运算符编写的代码


double Polynomial::operator[](int index) const {
    int maxT = this->currentMax;
    if (index > 0 && index < this->getDegree(false))
        return this->coefficients[index];
    cout << "overflow in index";
    system("pause");
}

【问题讨论】:

  • TL;DR: double Polynomial::operator... --> double &amp;Polynomial::operator...
  • 虽然在operator[] 中进行边界检查并没有错误,但它是非常规的。大多数容器在operator[] 中跳过边界检查(尽可能快)并提供一个名为at() 的成员函数,它会进行边界检查并在index 超出范围时抛出异常。顺便说一句,index 通常应该是unsigned 类型,例如size_t。这是一个简单的例子:godbolt.org/z/qr26cd
  • 没有single操作符[]=,所以不能重载。您可以重载[] 运算符和= 运算符。
  • @ThomasMatthews 我没有看到运营商 []= 提及或暗示。标题分别提到了[]=

标签: c++ class oop operator-overloading


【解决方案1】:

您的operator[]const 方法,因此不能用于修改成员。除非您想做一些花哨的事情来分配给一个元素,否则当您的 operator[] 返回对该元素的引用时,您并不真的需要一些 operator=

如 cmets 中所述,在 operator[] 中进行边界检查并不常见。考虑到在循环中,每次调用operator[] 都会进行边界检查,即使用户确保只使用有效索引。那不是很有效。因此,除了您的 const 运营商之外,您还可以提供这个

double& Polynomial::operator[](size_t index)  {  // <-- no const
    return coefficients[index];
}

假设你也有一个size 方法,那么你可以编写一个循环:

for (size_t i=0; i< poly.size(); ++i) {
    poly[i] = i;
}

PS:system("pause") 是不行的,见system("pause"); - Why is it wrong?

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 2016-02-19
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多