Hello~好久没更新了,据本人所知,上次距离现在至少有一个世纪一个月的历史。
今天我们继续学习类,但是有一些新的不好学的东西。
1.回顾
上一次我们学习了类,类相当于结构体。
需要这样使用:
class <类名> {
<成员>
};
2.构造函数和析构函数
2.1.构造函数
在我们每一次创建一个对象时,这个函数就会被调用,它叫构造函数。
它的函数名,就是类名!
比如:
class Vector {
int x;
int y;
int way;
};
它的构造函数是:
Vector() {
}
从中可以看出,Vector没返回值,这里。。。切记!
虽然构造函数没有返回值,但是它的属性并不是void!
(也不是什么乱七八糟的指针什么的)
没有这个函数,我们的类没办法运行。
2.1.1.默认构造函数
但是,比如你测试时,发现你不写构造函数,也能运行。
因为我们的Dev-C++非常的狗血良心,它会给我们提供一个默认的构造函数。
就是:
<类名>() {
}
当然,它不是不能干事,比如我们给它承担一个初始化的工作:
class Vector {
public:
int x;
int y;
int way;
private:
Vector() {
x = 0;
y = 0;
way = 0;
}
};
这里只是做一个演示,构造函数不管你放public,还是private,不会报错的。
但是,如果我们想在新建对象时初始化:
Vector v = {1 /*x*/, 2/*y*/, 90 /*way*/};
会寄。
2.1.2.带参的构造函数
怎么办呢?
可以把构造函数上挂形参:
Vector(int a, int b, int c) {
x = a;
y = b;
way = c;
}
试一下:
#include <bits/stdc++.h>
using namespace std;
class Vector {
public:
int x;
int y;
int way;
Vector(int a, int b, int c) {
x = a;
y = b;
way = c;
}
};
int main() {
Vector v = {1, 2, 90};
cout << v.x << " " << v.y << " " << v.way;
return 0;
}
(不知道什么叫<bits/stdc++.h>的,翻我前面的东西。)
这时候,需要把构造函数放到public里面。要不然:
也就是说,根据上面的东西,下面的都等价:
Vector v = {1, 2, 90}; //大括号初始化(C++11)
Vector v = Vector(1, 2, 90); //显式调用构造函数
Vector v(1, 2, 90); //隐式调用构造函数
2.2.析构函数
跟构造函数一样,在对象寄了的时候,析构函数会被调用。
2.2.1.默认析构函数
就是:
~<类名>() {
}
也就是说,对于Vector,它的(默认)析构函数如下:
~Vector() {
}
析构函数跟构造函数不一样,它不能有参。
2.2.2.析构函数
一般,我们直接定义析构函数,它的用途是清理指针用的new(malloc()),在析构函数里调用delete(free())。
比如:
class Vector {
public:
int * x;
int * y;
int * way;
Vector(int a, int b, int c) {
x = new int; //malloc(sizeof (int))
y = new int;
way = new int;
*x = a;
*y = b;
*way = c;
}
~Vector() {
delete x; //free(x);
delete y;
delete way;
}
};
此外,还有移动构造函数,移动析构函数等等,不再介绍。
拜~