三.内容
以类Complex为例
复制代码
1 class Complex
2 {
3 public:
4 Complex(double x = 0, double y = 0)
5 :m_x(x), m_y(y){}
6
7 void dis()
8 {
9 cout<<"("<<m_x<<", “<<m_y<<”)"<<endl;
10 }
11 protected:
12 double m_x;
13 double m_y;
14 };
复制代码
1.以实现单目运算符prefix++和surfix++为例。
先提这个例子,一是因为我在复习这块时遇到了一点问题,二是这个有点特别,涉及到哑元的问题。
prefixe++
1).考虑基本数据类型,以int类型为例,如下的操作都是可以的;
1 int a = 1;
2 ++a;
3 ++++a;
2).先实现基本的语义,代码如下:
复制代码
1 Complex Complex::operator++(void)
2 {
3 m_x++;
4 m_y++;
5 return *this;
6 }
复制代码
3)考虑添加
重载函数返回的是对象自身,并且需要修改对象,我们即可以想到返回的是引用类型。注意,此时引用指向的对象在重载函数调用时就已经存在了。
4)先运行一下,看下是否能编译通过
++c1;
++++c1;
此时重载函数实现的效果,与基本类型效果一致,符合预期,此时就不考虑重载函数前面是否加const修饰了。
复制代码
1 #include
2
3 using namespace std;
4
5 class Complex
6 {
7 public:
8 Complex(double x = 0, double y =0)
9 :m_x(x), m_y(y){}
10
11 void dis()
12 {
13 cout<<"("<<m_x<<", “<<m_y<<”)"<<endl;
14 }
15
16 Complex & operator++(void);
17 protected:
18 double m_x;
19 double m_y;
20 };
21
22 Complex & Complex::operator++(void)
23 {
24 m_x++;
25 m_y++;
26 return *this;
27 }
28
29 int main()
30 {
31 double a = 1.0;
32 cout<<++a<<endl;
33 ++++a;
34 cout<<a<<endl;
35
36 Complex c1(1.0, 2.0);
37
38 Complex cc = ++c1;
39 cc.dis();
40 cc = ++++c1; // cc = (c1.operator++()).operator++();
41 cc.dis();
42
43
44 return 0;
45 }
复制代码
结果如下
surfix++
为了区分prefix++和surfix++两个成员函数,须使用哑元进行区分(引入 哑元,增加了入参的方式,在调用时不需要添加任何的参数),其实类似一个占位符。
1).考虑基本数据类型,以int类型为例,可以进行的操作和不可以进行的操作
1 int b = 1;
2 b++; // 支持
3 b++++; // 不支持
2).先实现基本的语义,代码如下
复制代码
1 Complex operator++(int)
2 {
3 Complex temp = *this;
4 m_x++;
5 m_y++;
6 return temp;
7 }
复制代码
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com