C++构造-析构函数

构造函数:与普通函数相比有三点不同。

  1. 和定义的结构体/类名字完全一样。
  2. 没有返回值。
  3. 调用的时机:创建一个对象的时候,对结构体内的对象赋值,初始化用的。而成员函数print()是创建完对象再调用。
  4. 构造函数不是必须有的,但是一旦定义了构造函数,在创建对象的时候必须要用,否则报错。
  5. 如果即想有构造函数,创建对象的时候不想赋值,那么久再提供一个空的构造函数。
  6. 构造函数可以写多个,但是不能写成一模一样的。
  7. 多个构造函数又称为:重载,构造函数重载。
  8. 结构体/类中的成员函数(方法)名字也可以一样,但是不能完全相同,这种情况下也称为重载,成员函数重载。
  9. 函数重载时,必须名字一样,参数类型,个数不一样才满足。而名字一样,参数一样,返回类型不一样是不允许的。
  10. 重载有什么好处?可以让我们写多个功能类似函数时少起名字。
  11. 创建对象的时候就会调用构造函数,自己不写,编译器会帮你写一个。
  12. 创建一个子类对象,父类的构造函数先调用,然后才调用子类的构造函数。
#include<stdio.h>
struct Person
{
	int age;
	int level;
	Person(int age, int level)
	{
		this->age   = age;
		this->level = level;
	}
    Person()
    {
    
    }
	void print()
	{
		printf("age = %d, level = %d\n",age,level);
	}
	void print(int x)
	{
		printf("age = %d, level = %d\n",age,level);
	}
	void print(char x)
	{
		printf("age = %d, level = %d\n",age,level);
	}
};
int main(int argc,char *argv[])
{
	Person p(1,2);
	p.print();
	return 0;
}

析构函数:

  1. 配合构造函数使用,如果结构体/类没有用到堆的空间,可以不用析构函数,但是一旦有成员函数或者构造函数使用了堆上的空间,那就必须要使用析构函数。自己在成员函数中free堆的空间也可以,但是如果此成员函数释放了,别的成员函数又想要用怎么办?难道是再次申请?所以释放的时机是较难把握的,合理的释放时机就是在创建的对象完全不用的时候释放,所以C++提供了析构函数,用来最后释放堆上的内存。
  2. 构造函数可以重载,析构函数不允许重载,首先没必要,再者编译器不知道调用哪个。
  3. 析构函数不能写返回值。
  4. 析构函数不是我们手动调用,而是编译器自动调用。
#include<stdio.h>
#include<malloc.h>
struct Person
{
	int age;
	int level;
	char * arr;
	Person(int age, int level)
	{
		this->age   = age;
		this->level = level;
		arr = (char *)malloc(1024);
	}
	~Person()
	{
		free(arr);
		printf(" 析构函数调用打印\n");
	}

};
int main(int argc,char *argv[])
{
	Person p(1,2);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雲烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值