构造函数
是一种特殊的函数,函数名与类名相同,没有返回值;是C++引入的一个机制,专门用于初始化。
C++保证每个对象被创建时都会调用构造函数。
分为以下几种(默认构造和有参构造)
默认构造
如果没有显式的定义任何构造函数,系统会默认的生成一个无参构造函数(什么都不做)。
当我们声明了任何一个构造函数后,系统不会生成默认构造函数。
例如,(系统默认生成的无参构造函数)
1 class A {
2 public:
3 A() {
4
5 }
6 };
main函数中:
A a;//A a();这个就相当于声明函数了
有参构造
例如,(自己构造的有参构造函数)
1 class A {
2 public:
3 A(int,int) {
4
5 }
6 };
main函数中:
A a(int,int);//括号里是两个int类型参数
析构函数
当对象释放时才会调用的函数,用来处理对象管理的内存。
例如,
1 #include <string>
2 #include<iostream>
3 using namespace std;
4 class A {
5 public:
6 char* str;
7 A() {
8 str = (char*)malloc(20);//C++中malloc使用必须强制转换
9 }
10 ~A() {//析构函数
11 free(str);
12 }
13 };
14 int main() {
15
16 }
初始化参数列表
构造函数里可以有初始化参数列表,初始化参数列表负责指定所有成员的初始化参数。
构造函数中初始化可以在“:”后边,也可以在构造函数里边。
(初始化参数列表只能在构造函数中写。)
例如,
1 class A {
2 int a;
3 int b;
4 public:
5 A() :a(5),b(3){
6
7 }
8 };
还有其他形式的初始化参数列表,就不写代码了。
传参时的初始化列表更有趣,哈哈
匿名对象
1 #include <string>
2 #include<iostream>
3 using namespace std;
4 class A {
5 public:
6 string toString() {
7 return NULL;
8 }
9 };
10 int main() {
11 A();//创建了一个匿名对象,该行代码结束就析构
12 cout << A().toString() << endl;//创建一个匿名对象,调用类中方法,该行代码结束就调用析构
13 return 0;
14 }
如果要保存匿名对象,可以创建一个对象保存:
A b = A();
匿名对象传参也可以:
A(int,int);
下面是我自己练习的一个代码程序:
1 #include<iostream>
2 #include<string>
3 using namespace std;
4 class B {
5 public:
6 B() {
7 cout << "调用了B无参构造函数" << this << endl;
8 }
9 B(int, int) {
10 cout << "调用了B有参构造函数" << this << endl;
11 }
12 };
13 class A {
14 B ob;//no.1
15 B obj;//no.2
16 int a;
17 int b;
18 int c;
19 char* str;
20 public:
21 A() :a(1),b(2),c(3),obj(66,77),ob(){//初始化参数那块的顺序与开始创建对象(例如:no.1和no.2)的顺序有关
22 cout << "当前行数" << __LINE__ <<"调用了无参构造函数" << "当前地址" << this << endl;
23 a = 20;
24 b = 10;
25 c = 70;
26 str = (char*)malloc(10);
27 }
28 string Tostring() {
29 return("[" + to_string(a) + "," + to_string(b) + "," + to_string(c) + "]" );
30 }
31 A(int a,int b) {
32 cout << "当前行数" << __LINE__ << "调用了有参构造函数" << "当前地址" << this << endl;
33 this->a = a;
34 this->b = b;
35 c = 90;
36 str = (char*)malloc(10);
37 }
38 ~A() {
39 free(str);
40 cout << "当前行数" << __LINE__ <<"析构当前构造函数"<<"当前地址"<< this << endl;
41 }
42 };
43 int main() {
44 A a;
45 cout << "当前行数" << __LINE__ << endl;
46 cout << a.Tostring() << endl;
47 A b(3,3);
48 cout << "当前行数" << __LINE__ << endl;
49 cout << b.Tostring() << endl;
50 A();//构造一个匿名函数,该行代码结束就销毁
51 cout << A().Tostring() << endl;
52 A(5, 5);
cout << A(5,5).Tostring() << endl;
}