C++重载运算符= 的返回值问题

紫书p124中有这样一个关于高精度计算的代码(节选):

struct bigInteger{
	static const int BASE = 1e8;
	static const int WIDTH = 8;
	vector<int> num;
	bigInteger operator = (const string &str){
		num.clear();
		int len = (str.length()-1)/WIDTH + 1;
		for(int i=0; i<len; i++){
			int end = str.length() - i*WIDTH;
			int start = max(0, end - WIDTH);
			num.push_back(atoi(str.substr(start, end-start).c_str()));
		}
		return *this;
	}
};

这里的 bigInteger operator = (const string &str){...}写成void operator = (const string &str){...}不是更好吗?,尤其是在时间要求十分苛刻的题目里。还是说第二种写法可能会产生一些意外的结果?(然而实际测试中并没有发现问题)

还有一种写法就是bigInteger& operator = (const string &str){...}直接返回结果的引用,这种写法的效率又如何呢?

如果在一道时间要求十分苛刻的题目,我应该选择第几种写法呢?

初次接触运算符重载,小白求教~

如果用void返回类型,就不能使用a=b=c这种方式了。