北京大学程序设计MOOC作业详解-04-运算符重载
第一题:
第一题分析:
重载下标运算符(方括号运算符),一定只有一个参数,无论是多维数组还是一维数组。可以总结如下:
1)一维数组:函数声明是 T operator[](size_t idx);
2)二维数组:函数声明是 T* operator[](size_t idx);
3)三维数组:有两种实现方式,可以是 T** operator[](size_t idx);
;也可以是CArray2D* operator[](size_t);
,这种情况会返回一个cArray2D[idx]
对象,这个对象仍然重载了下标运算符,和第2)种情况一致了。
因此,本题选A。
第三题:
第二题之前做过了,直接跳过。
第三题分析:
重载输入输出运算符是比较特殊的函数,这两个函数必须重载为待输出类的友元函数,而并非ostream类的成员函数。友元函数,也可以看作全局函数,只是和类具有友元关系而已。
为了能够连续调用(前面的作业讲解提到过),即能够cout << obj1 << obj2 << ...
,需要返回引用。为了返回的引用和cout对象一致,重载的函数参数也必须是引用,因此返回值和第一个参数均是ostream&类型。例如:
friend ostream& operator<<(ostream& os, const MYCLASS& obj);
friend istream& operator>>(istream& is, MYCLASS& obj);
需要注意,输入函数会改变MYCLASS对象,因此不能是常引用。综上所述,本题选A。
第四题:
第四题分析:
自增运算符的前置和后置,根据重载运算符函数是否有参数决定,可以这样理解:
1)后置运算符,例如iter++,可以等价于iter+1,因此重载的运算符会有一个int参数,举个例子:
MYCLASS operator++(int) {
MYCLASS ret = *this;
this->val++;
return ret;
}
2)迁至运算符,例如++iter,这里后面没有加上整数,也不存在1+iter的语义,因此重载的运算符函数不会有int参数,举个例子:
MYCLASS& operator++(int) {
this->val++;
return *this;
}
要注意的是,这里的自增操作,会作用到this指针,且返回这个this指针,因此是返回一个引用。不要死记硬背,只要修改操作并非临时的一个拷贝,就是返回引用。综上所述,本题选B。
后面的题目明天再分析