关于#c++#的问题:关于运算符重载的一个问题

img


关于运算符重载的一个问题,注意返回值一个是值,一个是引用,两个有不同的区别

模板类,大部分代码都写出来了
double& va = arr[index]; //返回引用
double vb = arr[index]; //返回值
返回引用的,修改va,也会改变数组中的值。
返回值的,修改vb,不会改变数组中的值。

#include <iostream>
using namespace std;

template <typename T, int N >
class Array {
    T data[N];
    int nLength;                //实际存放的元素个数
public:
    Array() { nLength = 0; }
    int getLength() { return nLength; }            //取实际元素个数
    bool put(T value)            //将value加入data[]中
    {
        if (nLength < N)
        {
            data[nLength++] = value;
            return true;
        }
        return false;
    }
    bool set(int index, T value)  //设置某元素的值
    {
        if (index < nLength)
        {
            data[index] = value;
            return true;
        }
        return false;
    }
    bool get(int index, T& value) //获取某个元素的值,放入value中
    {
        if (index < nLength)
        {
            value = data[index];
            return true;
        }
        return false;
    }
    T& operator[] (int index)  //取某个位置元素的值,返回该值,可以与++或--联用
    {
        return data[index];
    }
    T operator[] (int index) const
    {
        T v = data[index];
        return v;
    }
    virtual ~Array() {}
};

int main()
{
    Array<double, 10> arr;
    double v;
    cout << "请输入3个数存放如数组:" << endl;
    for (int i = 0; i < 3; i++)
    {
        cin >> v;
        arr.put(v); //调用put插入数组
    }
    cout << "当前存放的元素个数:" << arr.getLength() << endl;

    int index = 0;
    cout << "请输入要获取的元素下标(从0开始):";
    cin >> index;
    if (arr.get(index, v))
        cout << "该元素为:" << v << endl;
    else
        cout << index << "大于实际元素个数,获取失败!" << endl;

    cout << "请输入需要修改的元素下标及新值:";
    cin >> index >> v;
    if (arr.set(index, v))
        cout << "设置成功!" << endl;
    else
        cout << index << "大于实际元素个数,设置失败!" << endl;

    cout << "请输入要获取的元素下标(从0开始):";
    cin >> index;
    double& va = arr[index]; //返回引用
    cout << "double& va = arr["<< index << "],调用返回值为引用的重载函数,va的值为:" << va << endl; //使用[]注意不要越界
    
    va = 10; //
    cout << "设置va=10后,double vb = arr["<< index << "],调用返回值为普通类型的重载函数,vb值为:";
    double vb = arr[index];
    cout << vb;
    return 0;
}

返回如果是值,相当于拷贝了一份,但是修改它是不会修改原始数据的。适合只读的情况。

返回如果是值,相当于拷贝了一份,但是修改它是不会修改原始数据的。适合只读的情况。

该回答结合了ChatGPT:
以下是根据题目要求编写的模板类 Array 的代码实现,同时还包含了一个简单的测试程序。


#include <iostream>
using namespace std;

template <typename T, int N>
class Array {
private:
    T data[N];
    int Length;
public:
    Array() {
        Length = 0;
    }

    int getLength() const {
        return Length;
    }

    bool put(T value) {
        if (Length >= N) {
            return false;
        }
        data[Length++] = value;
        return true;
    }

    bool set(int index, T value) {
        if (index >= 0 && index < Length) {
            data[index] = value;
            return true;
        }
        return false;
    }

    bool get(int index, T& value) const {
        if (index >= 0 && index < Length) {
            value = data[index];
            return true;
        }
        return false;
    }

    T& operator[](int index) {
        return data[index];
    }

    T operator[](int index) const {
        return data[index];
    }

    virtual ~Array() {}
};

int main() {
    Array<int, 5> arr;
    cout << "put(1): " << arr.put(1) << endl;
    cout << "put(2): " << arr.put(2) << endl;
    cout << "put(3): " << arr.put(3) << endl;
    cout << "put(4): " << arr.put(4) << endl;
    cout << "put(5): " << arr.put(5) << endl;
    cout << "put(6): " << arr.put(6) << endl;
    cout << "getLength(): " << arr.getLength() << endl;

    cout << "set(2, 100): " << arr.set(2, 100) << endl;
    int value;
    cout << "get(2, value): " << arr.get(2, value) << ", value: " << value << endl;

    cout << "arr[2]: " << arr[2] << endl;
    arr[2]++;
    cout << "arr[2]: " << arr[2] << endl;

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632