CPP学习之——创建及取消临时对象(11.4-6)

一 概述

本节课主要讲述运算符变换的过程中临时对象的创建,最后取消创建临时对象,借助自身函数,实现运算符的重载

二 创建临时对象

2.1 创建临时对象一

2.1.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
using namespace std;
class num
{
private:
int n;
public:
num(){n=1;}
~num(){}
int get()const{return n;}
void set(int x){n=x;}
void add(){n++;}
num operator++()
{
++n;
num t;
t.set(n);
return t;
}

};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
//i++;
i.add();
cout<<"i:"<<i.get()<<endl;
//++i;
num n=++i;
//num n=i.operator ++();
cout<<"i:"<<i.get()<<endl;
return 0;
}

2.1.2 输出结果

1
2
3
i:1
i:2
i:3

2.2 运算符重载值——临时对象(构造函数)

2.2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
using namespace std;
class num
{
private:
int n;
public:
num(){n=1;cout<<"构造函数执行\n";}
num(int i){n=i;cout<<"带参数的构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){n++;}
num operator++()
{
++n;
return num(n);
}

};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
//i++;
i.add();
cout<<"i:"<<i.get()<<endl;
//++i;
num n=++i;
//num n=i.operator ++();
cout<<"i:"<<i.get()<<endl;
return 0;
}

三 取消创建临时对象

3.1 理论

  • 我们知道this指针就是对象的标签,而某个对象的成员变量也会被编译器自动贴上标签(this指针)以证明是某个对象的,那么我们只要将成员变量自加,然后再返回该成员变量的标签,也就是this指针即可

3.2 this变换

3.2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
using namespace std;
class num
{
private:
int n;
public:
num(){n=1;cout<<"构造函数执行\n";}
num(int i){n=i;cout<<"带参数的构造函数执行\n";}
num(const num&s){this->n=s.n;cout<<"复制构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){n++;}
num operator++()
{
++n;
return *this;
}

};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
//i++;
i.add();
cout<<"i:"<<i.get()<<endl;
//++i;
num n=++i;
//num n=i.operator ++();
cout<<"i:"<<i.get()<<endl;
return 0;
}

3.3 ++++变换

3.2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;
class num
{
private:
int n;
public:
num(){n=1;cout<<"构造函数执行\n";}
num(int i){n=i;cout<<"带参数的构造函数执行\n";}
num(const num&s){this->n=s.n;cout<<"复制构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){n++;}
const num &operator++()
{
++n;
return *this;
}

};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
//i++;
i.add();
cout<<"i:"<<i.get()<<endl;
//++i;
num n=++i;
//num n=++++i;
//num n=i.operator ++();
cout<<"i:"<<i.get()<<endl;
return 0;
}