赋值重载函数要不要返回引用类型

几乎所有的资料都说必须返回引用,否则不能实现诸如a=b=c=d这样子的连续赋值。

真是情况并非如此,如果取消引用,代码依然不会出现问题,那么这时候和返回引用类型有差别吗?

有的,差别在于:如果不返回引用,代码在调用operator=以后,会接着调用拷贝构造函数。而返回引用的情况下,则不会有这一步操作。

原因在于函数返回的时候,编译期会创建一个临时变量,这时候就调用了拷贝构造函数。

以下代码可以验证(代码较多,仅需关注赋值运算符重载即可):

myarray.h代码

#ifndef _MYARRAY_
#define _MYARRAY_
template <class T>
class MyArray
{
private:
    int mCapacity;
    int mSize;
    T *pAddr;

public:
    MyArray(int capacity = 10);
    MyArray(const MyArray<T> &array);
    ~MyArray();
    T &operator[](int index);
    MyArray<T> &operator=(const MyArray<T> &array);
    void PushBack(const T &t);
    //void PushBack(const T &&t);
};
#endif

myarray.cpp代码

#include <iostream>
#include "myarray.h"
using namespace std;

template <class T>
MyArray<T>::MyArray(int capacity) : mCapacity(capacity), mSize(0)
{
    pAddr = new T[capacity];
};

template <class T>
MyArray<T>::MyArray(const MyArray<T> &array)
{
    cout << "called construct copy\n";
    pAddr = new T[array.mCapacity];
    mCapacity = array.mCapacity;
    mSize = array.mSize;
    for (int i = 0; i < mSize; i++)
        pAddr[i] = array.pAddr[i];
}
template <class T>
T &MyArray<T>::operator[](int index)
{
    if (index >= mSize || index < 0)
        throw "index error,must between 0 and Array size";
    return *(pAddr + index);
}

template <class T>
MyArray<T> &MyArray<T>::operator=(const MyArray<T> &array)
{
    cout << "called operator= copy\n";
    pAddr = new T[array.mCapacity];
    mCapacity = array.mCapacity;
    mSize = array.mSize;
    for (int i = 0; i < mSize; i++)
        pAddr[i] = array.pAddr[i];
    return *this;
}

template <class T>
void MyArray<T>::PushBack(const T &t)
{
    if (mSize >= mCapacity)
    {
        cout << "Array is full,can not push back an element\n";
        return;
    }
    pAddr[mSize] = t;
    mSize++;
}
template <class T>
MyArray<T>::~MyArray()
{
    delete[] pAddr;
    pAddr = nullptr;
}
template class MyArray<int>;

main测试代码:

int main()
{
    MyArray<int> array;
    array.PushBack(1);
    array.PushBack(3);

    MyArray<int> arr1, arr2, arr3;
    arr3 = arr1 = arr2 = array;
    return 0;
}
posted @ 2021-03-26 15:59  大神的老爸  阅读(83)  评论(0编辑  收藏  举报