构造函数:
格式:类名(){}
作用:进行初始化;
1.可以传递参数,因此可以发生函数重载
2.构造函数分为三类:无参构造(默认构造) 有参构造 函数拷贝构造
3.调用时机,当构建一个类时就会调用一次;
析构函数:
格式:~类名(){}
作用:用于删除存储;
1.不可以传递参数
2.当构建的类需要被释放时,就会调用此函数;
在程序员自身没有编译构造函数与析构函数时,编译器会自动编译一个空的构造函数和析构函数(即小括号与大括号中都为空);
可以这样理解:
每人都有一部手机,手机买回来的时候,它会有一个自我的手机界面,有应用市场、设置等app,这些不需要我们进行任何操作的,就是构造函数的作用---初始化;
而在我们需要买新手机的时候,我们的旧手机就直接丢了嘛?我们一般都是要先删除数据吧,而析构函数的作用就是将这些数据进行删除;
#include<iostream>
#include<string>
using namespace std;
class person {
public:
//属性最好是赋予private权限,这里为了方便采用公共权限;
int age;
string age2;
//构建函数
person() {
cout << "无参构建函数调用" << endl;//也是默认构建函数
}
person(int a_age) {
age = a_age;
cout << "有参构建函数调用" << endl;//参数为a_age
}
person(string a_age) {
age2 = a_age;
cout << "重载 有参 构建函数调用" << endl;//这里为了体现重载,增加了一个属性age2 定义为string型 避免有年龄为 "负" 的;
}
person(const person& p) {
age = p.age;
cout << "拷贝构造函数调用" << endl;//在参数传递处,不可使用person p; 传递进来一个类,我们根据此类进行构建初始化,不能够对传递进来的类进行修改,需要const进行修饰;
}
~person() {//所有我们定义的person类都将使用同一析构函数释放内存;
cout << "析构函数调用" << endl;
}
};
void test01() {
person p1;
}
void test02() {
person p2(10);
}
void test03() {
person p3(10);
person p4(p3);
}
void test04() {
string a="10000";
person p5(a);
}
int main() {
test01();
test02();
test03();
test04();
return 0;
}
可以一个test一个test 的看,本文中使用的定义方法:括号法----person p2(10)
还有显示定义法 隐式定义法 可以自行查找资料;
注意:
若使用括号法,记得默认析构时 语法为:person p;
而不是person p();
若写成了person p(); 程序不会构建一个person类,而是会将它错当作成一个函数声明;