-
Notifications
You must be signed in to change notification settings - Fork 272
/
拷贝构造函数和复制函数
69 lines (60 loc) · 2.82 KB
/
拷贝构造函数和复制函数
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <math.h>
#include <limits>
#include <iostream>
#include <vector>
using namespace std;
class NumberOp{
public:
NumberOp(){}
// 拷贝构造函数不要声明成 explicit,因为return调用的是隐式拷贝构造函数,因为是return是初始化新对象,所以和复制函数没关系
//为什么加explicit返回引用不会提示错误,因为返回引用不会构造新对象。return默认调用隐式拷贝构造函数
NumberOp(const NumberOp &other) //不设置引用传参的话每次都会调用拷贝构造函数,所以拷贝构造函数必须是引用
{
x = other.x;
cout << "调用拷贝构造函数" << endl;
}
NumberOp(double x_){
x = x_;
}
// + ,-等一般返回的不是引用,因为没有必要
//如果用this去返回,这会改变原来的值,+的要求一般不要求改变原来的值
//为何设置引用,是因为不设置引用传参的话每次都会调用拷贝构造函数,所以拷贝构造函数必须是引用
// 同时,返回不是引用的话,返回也会调用拷贝构造函数。
NumberOp& operator+(NumberOp a); //+不能加&,否则n1+n2,n1的值也就直接改变了
// 因为= += -= 的this指针直接返回就行且=本来就要求改变原来的值
NumberOp& operator=(NumberOp a); //必须返回,因为只有返回才能连续赋值,+号也一样,才能连续+和跟赋值运算
double x;
};
NumberOp& NumberOp::operator+(NumberOp a){ //左值参数即this默认是引用传递,+号没必要带引用
/*NumberOp newOp;
newOp.x = x + a.x;
return newOp;*/
this->x = this->x + a.x;
return (*this);
}
NumberOp& NumberOp::operator=(NumberOp a){ //1. 操作符重载实现为类成员函数
this->x = a.x;
cout << "调用赋值运算" << endl;
return (*this);
}
//NumberOp operator*(NumberOp a, NumberOp b){ //2. 操作符重载实现为非类成员函数(全局函数),全局函数的return也调用的是此类的拷贝构造函数
//由于都是调用拷贝构造函数,所以即使是局部变量或者形参return,因为调用的是拷贝构造函数,所以不管是返回引用还是非引用都无bug,都是返回一个新的对象
NumberOp operator*(const NumberOp &a, const NumberOp &b){
NumberOp newOp;
newOp.x = a.x * b.x;
return newOp;
}
int main()
{
NumberOp n1(2.5), n2(3.7);
NumberOp newN1, newN2, newN3(n1), newN4; //NumberOp newN3(n1)等价于NumberOp newN3 = n1,都是初始化,而非赋值运算,都调用的是复制构造函数
newN4 = n1 * n2;
cout << newN4.x << endl;
cout << (n1+n2).x << endl;
cout << n1.x << endl;
//cout << n1.x << endl;
//n1*n2;
//newN1 = n1 + n2; //重载运算符后可以直接使用对象直接相加
//newN2 = n1 * n2; //重载运算符后可以直接使用对象直接相加
return 0;
}