目录
一、构造函数:
构造函数是一种特殊的成员函数,与其他成员函数不同,它不需要用户手动调用,而是在建立对象的时候自动调用。
特点:
-
构造函数名和类名相同
-
构造函数可以重载
-
构造函数没有返回类型声明
调用:
-
自动调用(隐式) 一般情况下C++编译器会自动调用构造函数(无参构造)
- 手动调用(显示) 在一些情况下则需要手工调用构造函数(有参构造)
二、析构函数
析构函数与构造函数类似,不需要用户来调用,而是在释放对象时自动调用
特点:
-
析构函数名和类名相同,但是得在前面加一个波浪号 ~
-
析构函数只能有一个
-
构造函数没有返回类型声明
三、构造/析构函数调用机制
#include<iostream>
using namespace std;
class text
{
public:
//构造函数
text()
{
cout << __FUNCTION__ << endl;
}
//析构函数
~text()
{
cout << __FUNCTION__ << endl;
}
private:
};
int main()
{
text t1;//创建对象t1
text t2;//创建对象t2
return 0;
}
运行结果:
结论:
-
先创建的对象先构造,后创建的对象后构造
-
先创建的对象后析构,后创建的对象先析构
构造函数的分类:
1、无参构造函数
- 直接创建对象即可调用
- 不要在对象后面加(),无参构造函数不能显式调用
2、有参构造函数
//1,括号法
Test t1(20,"cc");
t1.print();
//2,赋值符号
Test t2 = {18,"maye"};
t2.print();
//3,匿名对象
Test t3 = Test(90,"plus");
t3.print();
//注意:
Test tt; //error:类Test不存在默认构造函数
如果没有写有参构造函数,那么C++编译器会自动帮我们生成一个无参构造函数 如果写了有参构造函数,那么就不会帮我们生成了,必须自己写一个无惨构造函数,才能直接定义对象。
3、拷贝构造函数
用一个对象去初始化另一个对象时(函数传参也会拷贝),需要拷贝构造(如果自己没有写,编译器会自动帮我们生成)
Test t(1,"2");
//1,赋值符号
Test t1 =t;
//2,参数方法
Test t2(t);
t2 = t1; //这个调用的是赋值运算符重载函数
注意:定义之后进行赋值不会调用拷贝构造函数,而是调用赋值函数
4、移动构造函数
移动构造函数数用来实现移动语义,转移对象之间的资源(如果自己没有写,编译器会自动帮我们生成)