0
点赞
收藏
分享

微信扫一扫

北京大学程序设计MOOC作业详解-04-运算符重载(上)


北京大学程序设计MOOC作业详解-04-运算符重载

第一题:

北京大学程序设计MOOC作业详解-04-运算符重载(上)_c++

第一题分析:

重载下标运算符(方括号运算符),一定只有一个参数,无论是多维数组还是一维数组。可以总结如下:

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

第三题:

第二题之前做过了,直接跳过。

北京大学程序设计MOOC作业详解-04-运算符重载(上)_一维数组_02

第三题分析:

重载输入输出运算符是比较特殊的函数,这两个函数必须重载为待输出类友元函数,而并非ostream类的成员函数。友元函数,也可以看作全局函数,只是和类具有友元关系而已。

为了能够连续调用(前面的作业讲解提到过),即能够​​cout << obj1 << obj2 << ...​​,需要返回引用。为了返回的引用和cout对象一致,重载的函数参数也必须是引用,因此返回值和第一个参数均是ostream&类型。例如:

friend ostream& operator<<(ostream& os, const MYCLASS& obj);
friend istream& operator>>(istream& is, MYCLASS& obj);

需要注意,输入函数会改变MYCLASS对象,因此不能是常引用。综上所述,本题选A

第四题:

北京大学程序设计MOOC作业详解-04-运算符重载(上)_运算符_03

第四题分析:

自增运算符的前置和后置,根据重载运算符函数是否有参数决定,可以这样理解:

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

后面的题目明天再分析


举报

相关推荐

0 条评论