构造函数和析构函数

对象的初始化和清理是两个非常重要的问题 一个对象或者变量没有初始状态问题很大 同样使用一个完整对象或变量,没有及时清理,也会造成一定安全问题

C++利用构造和析构函数解决上述问题,这两个函数由编译器自动调用,完成对象初始化和清理工作。 对象的初始化和析构是必须要做的,如果我们不提供,编译器会提供空实现(什么也没有)的构造和析构

  • 构造函数:主要作用在于创建对象时为对象属性赋值,构造函数为编译器自动调用,无需手动调用
  • 析构函数:主要作用在于对象销毁前自动调用,执行一些清理操作
class Person
{
public:
	Person();
	~Person();
};

构造函数

类名(){/*body*/}

  1. 构造函数,没有返回值也不写void
  2. 函数名称与类名相同
  3. 构造函数可以有参数,因此可以发生重载
  4. 编译器自动调用,无需手动调用,而且只会调用一次

析构函数

~类名(){/*body*/}

  1. 析构函数,没有返回值也不写void
  2. 函数名称与类名相同,还要加一个符号~
  3. 析构函数不可以有参数,因此不可以发生重载
  4. 编译器自动调用,无需手动调用,而且只会调用一次
//from important
Person::Person()
{
	cout << "Person构造函数调用" << endl;
}
 
Person::~Person()
{
	cout << "Person析构函数调用" << endl;
}
 
int main()
{
	Person p;
	return 0;
	//output:
	//Person构造函数调用
	//Person析构函数调用
	//
}

编译器默认类函数

title:Summary
collapse:open
1. 默认构造函数
2. 默认构造函数
3. 默认拷贝构造函数,对属性值拷贝(浅)
4. 赋值运算符operator=,对属性值拷贝(浅)

函数分类以及调用

两种分类方式:

  • 按参数分:有参无参构造
  • 按类型分:普通拷贝构造

三种调用方式

 
class Person
{
public:
	Person(){cout << "Person无参构造函数调用" << endl;}//普通
	Person(int a){age = a; cout << "Person有参构造函数调用" << endl;}//有参
	Person(const Person &p)
	{this->age = p.age; cout << "Person拷贝构造函数调用" << endl;}//拷贝
	~Person(){cout << "Person析构函数调用" << endl;}
	
	int age;
};

括号法

 
//from important
int main()
{
	//默认调用
	Person p1;
	Person p2(10);
	Person p3(p2);
	/*output:
	Person无参构造函数调用
	Person有参构造函数调用
	Person拷贝构造函数调用
	Person析构函数调用
	Person析构函数调用
	Person析构函数调用
	*/
}

不要加括号,否则

 
//from important
int main()
{
	Person p1();
//    |    |
  //void func();
	//调用默认构造函数时不加()
	//因为这样编译器会认为是一个函数的声明,不会认为是在创建对象
}

显示法

 
//from important
int main()
{
	Person p1;
	Person p2 = Person(10);
	Person p3 = Person(p2);
	/*output:
	Person无参构造函数调用
	Person有参构造函数调用
	Person拷贝构造函数调用
	Person析构函数调用
	Person析构函数调用
	Person析构函数调用
	*/
}

匿名对象:

 
//from important
 
int main()
{
	//注意事项一
	//这是一个匿名对象  特点:对象创建执行结束后,系统会立即回收掉匿名对象
	Person(10);
	cout << "Hello World" << endl;
	/*output:
	Person有参构造函数调用
	Person析构函数调用
	Hello World
	*/
	
	//注意事项二
	//不要利用拷贝构造函数初始化匿名对象  编译器会认为Person(p3) == Person p3;对象声明,且不会析构
	Person(p3);//错误
	
}

隐式转换法(拷贝)

后面会有

 
//from important
int main()
{
	Person p1 = 10;//Person p1 = Person(10);
	Person p2 = p1;//Person p2 = Person(p1);
	/*output:
	Person有参构造函数调用
	Person拷贝构造函数调用
	Person析构函数调用
	Person析构函数调用
	*/
}

学习路径