重载运算符+在C ++中添加两个数组

无标题

任务是重载运算符+,以便添加两个数组。Array是具有两个私有成员的类int *数据和int m(数组的容量)。

void Array::setM(int m){
this->m = m;
this->data = new int[this->m];
}

int& Array::operator[](int i){
return this->data[i];
}


Array& Array::operator+(Array& a){
Array res;
if (this->m >= a.m) {
    res.setM(this->m);
    for (int i=0; i<this->m; i++){
    res.data[i] = this->data[i] + a.data[i];
    }
}
else if (this->m < a.m) {
    res.setM(a.m);
    for (int i=0; i<a.m; i++){
    res.data[i] = this->data[i] + a.data[i];
    }
}
Array& rez = res;
return rez;
}

这是主要的:

int main()
{
Array a(3);
Array& a1 = a;
a1[0] = 1;
a1[1] = 2;
a1[2] = 4;

Array b(3);
Array& b1 = b;
b1[0] = 1;
b1[1] = 2;
b1[2] = 4;

Array& c = a1.operator+(b1);
for (int i=0; i<3; i++){
    cout<<c[i]<<" ";
}
return 0;
}

当返回类型为Array时该函数工作正常,但是当返回类型为Array&时返回173104 42007364200896。我从c ++开始,所以引用有点使我感到困惑,我看不到函数返回引用类型的地方吗?

来自莫斯科的弗拉德

让我们逐步考虑您的运营商实施。

对于初学者,操作员内部的右侧操作数不变。因此,该函数至少应声明为

Array& operator+( const Array& a );

该函数Array在其主体内创建该类型的新对象

Array res;

因此,由于对象是函数的局部变量,因此您可能不会返回对其的引用。这意味着应该将运算符声明为

Array operator+( const Array& a );

要么

const Array operator+( const Array& a );

此代码段

if (this->m >= a.m) {
    res.setM(this->m);
    for (int i=0; i<this->m; i++){
    res.data[i] = this->data[i] + a.data[i];
    }
}

a.m小于时可以调用未定义的行为this->m

由于成员函数不会更改左操作数,因此该函数应为常量成员函数。

const Array operator +( const Array& a ) const;

通常,此类运算符被声明为类的单独的好友函数。

friend const Array operator+( const Array &a, const Array &b );

考虑到您可以在运算符中使用的算法,可以通过以下方式进行定义(在类定义之外。或者,如果要在类定义中定义算法,则需要使用说明符)

const Array operator+( const Array &a, const Array &b )
{
    int m = std::min( a.m, b.m );
    Array res( m );

    for ( int i = 0; i < m; i++ )
    {
        res.data[i] = a.data[i] + b.data[i];
    }

    return res;
}

请注意,该函数setM可能会导致内存泄漏,因为它不会删除该类型对象的早期分配的内存Array

void Array::setM(int m){
this->m = m;
this->data = new int[this->m];
}

那是功能不安全。

还请记住,带参数的构造函数应使用函数说明符声明explicit否则,您会遇到整数到类型的意外转换Array

在动态分配数组时,您需要至少显式地编写析构函数,复制构造函数和复制赋值运算符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中的重载运算符<

来自分类Dev

C ++中的重载运算符-> *

来自分类Dev

C ++中的重载运算符

来自分类Dev

C ++中的重载运算符=

来自分类Dev

在C ++中重载运算符

来自分类Dev

使用模板类在C ++中重载运算符

来自分类Dev

C ++中链表的重载运算符+ =

来自分类Dev

C ++中重载运算符的参数顺序

来自分类Dev

C ++禁用子类中的重载运算符

来自分类Dev

C ++禁用子类中的重载运算符

来自分类Dev

C#中数字类型的重载运算符

来自分类Dev

模板类中的C ++重载运算符

来自分类Dev

C ++中int和char的重载运算符

来自分类Dev

在C ++中重载运算符时指定“ const”

来自分类Dev

使用模板类在C ++中重载运算符

来自分类Dev

如何为包含 C++ 中抽象类数组的类重载运算符 []?

来自分类Dev

是否可以在C ++中重载运算符的关联性?

来自分类Dev

在C ++中重载运算符时如何防止整数歧义

来自分类Dev

在C ++中重载运算符时,“ const”是什么意思

来自分类Dev

在C ++中重载运算符时,为什么T *优于bool?

来自分类Dev

C ++中具有模板相关类型的重载运算符“ <<”

来自分类Dev

C ++中的模板类重载运算符ostream不起作用

来自分类Dev

通过带有类型通知的宏在C中重载运算符

来自分类Dev

在C ++中重载运算符<<时无法摆脱垃圾

来自分类Dev

C ++重载运算符'>>'

来自分类Dev

C ++重载运算符==

来自分类Dev

重载运算符C ++,复数?

来自分类Dev

C ++重载运算符[]

来自分类Dev

子类中的重载运算符