赋值重载函数要不要返回引用类型
几乎所有的资料都说必须返回引用,否则不能实现诸如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;
}