F_JustWei's Studio.

C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数

字数统计: 786阅读时长: 3 min
2021/05/29 Share

C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数

这是个类的代码,我用这个类来讲诉 C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数的使用。

例子:

Speaker.h:
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
#pragma once
#ifndef _SPEAKER_
#define _SPEAKER_

#include <string>
#include <vector>
using namespace std;
//支持不同类型的成绩
template<typename T>
class Speaker {
public:
string _id; //编号
string _name; //姓名
vector<T> _grade; //每次成绩
int _final_result; //最终名次
//默认构造函数
Speaker() = default;
//有参构造函数
Speaker(string id, string name, vector<T> grade = {}, int final_result = INT_MAX)
:_id(id), _name(name), _grade(grade), _final_result(final_result) {
cout << "有参构造函数:";
}
//拷贝构造函数
Speaker(const Speaker& t)
:_id(t._id), _name(t._name), _grade(t._grade), _final_result(t._final_result) {
cout << "拷贝构造函数:";
}
//移动构造函数
Speaker(Speaker&& t) noexcept
:_id(t._id), _name(t._name), _grade(t._grade), _final_result(t._final_result) {
cout << "移动构造函数:";
}
//拷贝赋值函数
Speaker& operator=(const Speaker& t) {
cout << "拷贝赋值函数:";
if (this != &t) {
_id = t._id;
_name = t._name;
_grade = t._grade;
_final_result = t._final_result;
}
return *this;
}
//移动赋值函数
Speaker& operator=(Speaker&& t) noexcept {
cout << "移动赋值函数:";
if (this != &t) {
_id = t._id;
_name = t._name;
_grade = t._grade;
_final_result = t._final_result;
}
return *this;
}
//析构函数
~Speaker() = default;
};

#endif
main.cpp:
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>
#include "Speaker.h"
using namespace std;
int main() {
//默认构造函数
Speaker<double> a;
//有参构造函数
Speaker<double> b("1","1");
cout << b._id << " " << b._name << endl;
//拷贝构造函数
Speaker<double> c(b);
cout << c._id << " " << c._name << endl;
//拷贝赋值函数
Speaker<double> d = b;
cout << d._id << " " << d._name << endl;//这里就很奇怪了,居然调用的是拷贝构造函数
d = b;
cout << d._id << " " << d._name << endl;//神奇的发现,这里又好起来了
/*
上面说明出现 = 的地方未必调用的都是赋值函数,也有可能构造函数
那么什么时候是调用拷贝构造函数,什么时候是调用赋值函数?
判断的标准其实很简单
如果临时变量是第一次出现,那么调用的只能是构造函数
反之如果变量已经存在,那么调用的就是赋值函数
*/
//移动构造函数
Speaker<double> e(move(b));
cout << e._id << " " << e._name << endl;
//移动赋值函数
Speaker<double> f = move(b);
cout << f._id << " " << f._name << endl;//这里也出现了和上面一模一样的情况
f = move(b);
cout << f._id << " " << f._name << endl;

return 0;
}
输出:
1
2
3
4
5
6
7
有参构造函数:1 1
拷贝构造函数:1 1
拷贝构造函数:1 1
拷贝赋值函数:1 1
移动构造函数:1 1
移动构造函数:1 1
移动赋值函数:1 1
CATALOG
  1. 1. C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数
    1. 1.0.1. 例子:
      1. 1.0.1.0.1. Speaker.h:
      2. 1.0.1.0.2. main.cpp:
      3. 1.0.1.0.3. 输出: