构造、析构。拷贝构造

构造函数、析构函数、拷贝构造函数

构造函数:

  • 构造函数在函数被调用的时候调用并初始化。
  • 构造函数必须要声明在全局作用域。
  • 没有返回值,也不需要写void
  • 函数名与类名相同
  • 可以有参数,可以发生重载
  • 构造函数由编译器自动调用且只调用一次,无需手动调用。

构造函数分类:

  • 按照参数分类:无参构造(默认构造函数)和有参构造。
  • 按照类型分类:普通构造函数,拷贝构造函数。
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>

using namespace std;


class Person {

private:
int _age;
public:

/**
* 构造函数:
* 构造函数在函数被调用的时候调用并初始化。
* 构造函数必须要声明在全局作用域。
* 没有返回值,也不需要写void
* 函数名与类名相同
* 可以有参数,可以发生重载
* 构造函数由编译器自动调用且只调用一次,无需手动调用。
* 构造函数分类:
* 按照参数分类:无参构造(默认构造函数)和有参构造。
* 按照类型分类:普通构造函数,拷贝构造函数。
*/
Person() {
cout << "hei二狗" << endl;
}


Person(int age) {
_age = age;
cout << "hei有参二狗" << endl;
}

/**
* 拷贝构造
* 1、用已有对象初始化新的对象。
* 2、值传递的方式给函数参数传值。
* 3、以值的方式返回局部对象。
*/
Person(const Person &person) {
_age = person._age;

}

/**
* 析构函数
* 没有返回值,不需要写void
* 函数名与类名相同 函数名前加 ~
* 不可以有参数,不可以重载
*/
~Person() {
cout << "ha二狗" << endl;
}

int get_age() const {
return _age;
}

void set_age(int _age) {
Person::_age = _age;
}

};


static void test01() {
Person person(19);

// 匿名对象:特点:当执行完该函数后立即释放。
// 不要用拷贝构造函数初始化匿名对象。
Person(200);

Person person1 = 20;

cout << person.get_age() << endl;
}

int main03(int argc, char *argv[]) {

test01();

return 0;

}