C+±学习记录-面向对象-构造函数和析构函数
0.重要性
对象的初始化和清理十分重要。如果对象没有初始化,使用的后果是未知。如果对象没有及时清理也会有问题。C++使用了构造函数和析构函数来解决这个问题。
构造函数和析构函数由编译器调用,不可手动调用。
1.构造函数 类名(参数){}
1.在类里面,构造函数一定要有,如果没有编译器会生成一个空的
2.构造函数用来给对象的成员属性赋值,初始化。在程序调用对象时会且只会调用一次
3.构造函数可以传入参数,因此可以发生重载。
4.函数名和类名相同。
5.构造函数没有返回值也不写void
2.析构函数 ~类名(){}
1.在类里面,析构函数一定要有,如果没有编译器会生成一个空的
2.析构函数用来执行一些清理操作,在对象销毁前由程序调用且只会调用一次
3.析构函数不可以有参数,因此不可以发生重载
4.函数名和类名相同,前面加上~
5.析构函数没有返回值也不写void
3.练习一下
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
| class charactor { public: string name; public: charactor(string n) { name = n; cout << "构造函数被调用" << endl;} ~charactor() { cout << "析构函数被调用" << endl; } };
void test() { charactor sllh("神里绫华"); }
int main() { test(); system("pause"); return 0; }
|
运行结果:
1 2 3
| 构造函数被调用 析构函数被调用 请按任意键继续. . .
|
若在main函数中初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class charactor { public: string name; public: charactor(string n) { name = n; cout << "构造函数被调用" << endl;} ~charactor() { cout << "析构函数被调用" << endl; } };
int main() { charactor sllh("神里绫华"); system("pause"); return 0; }
|
运行结果:
此时按下任意键,会有:
1 2 3 4 5 6 7
| 构造函数被调用 请按任意键继续. . . 析构函数被调用
D:\Work\C艹练习\练手\Project1\Debug\Project1.exe (进程 35528)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
|
在main函数中调用对象结束后,程序先执行了system(“pause”)
一些冷知识
1.类中的构造函数和析构函数可以在类内声明,写在类外,注意访问权限不能为private,protected访问权限不影响类外实现
2.类外实现语法: 类名::构造/析构函数名(){ }
3.析构函数尽量写为public
示例:
1 2 3 4 5 6 7 8 9
| class charactor { public: string name; public: charactor(string n); ~charactor(); }; charactor::charactor(string n) { name = n; } charactor::~charactor(){ cout << "析构函数被调用" << endl; }
|
3.构造函数初始化列表的另一种写法: 类名::构造函数名(参数列表):变量名(值),变量名(值){}
示例:
1 2 3 4 5 6 7 8 9 10 11 12
| class charactor { public: string name; public: charactor(string n); ~charactor(); };
charactor::charactor(string n):name(n) { cout << "构造函数被调用" << endl; }
|
4.构造函数和析构函数都不能被继承