C/C++构造函数和析构函数

本文深入探讨了构造函数和析构函数的概念及其在C++中的应用。详细讲解了构造函数如何为对象初始化,包括默认构造函数的重要性以及如何使用初始化列表。同时,剖析了析构函数的作用,即在对象销毁前进行资源清理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.构造函数
如哈让一个对象在创建的时候就被赋予了值——
构造函数是类的一种特殊的成员函数
(1)函数名必须和类名相同
(2)没有返回值

#include<stdio.h>
class Circle
{
	public:
		int x,y,radius;
		
	public://以下就是构造函数 
		Circle()
		{
			x = y = 0;
			radius = 1;
			printf("11111\n");
		}
		Circle(int x,int y,int radius)
		{
			this->x = x;
			this->y = y;
			this->radius = radius;
			printf("22222\n");
		}
};

int main()
{
	Circle a;
	Circle b(1,1,4);
	
	return 0;
}

二.析构函数
析构函数:对象被销毁时调用
(1)名称固定,在类名前加~
(2)没有返回值
(3)不能带参数
(4)析构函数只允许一个 不能重载

析构函数从不显式调用,都是编译器自定调用->在对象销毁时自动调用
对于局部变量(函数) ,在超出变量作用域后,该对象失效

#include<stdio.h>
class Circle
{
		
	public://以下就是析构函数 
		~Circle()
		{
			printf("1111111111\n");
		    
		}
	
};

int main()
{
	{
		Circle obj;
	}

	printf("---------------\n");
	return 0;
}

析构函数:在对象销毁之前,做一个清理善后的工作
比如:申请来的内存要释放掉,打开的文件要关闭掉

例如:

class StringBuffer
{
	public:
		StringBuffer()
		{
			m_buffer = malloc(1024);
		}
		~StringBuffer()
		{
			free(m_buffer);
		}

 } ;
 
 class DataStore
 {
 	public:
 		DataStore()
 		{
 			m_head.next = NULL;
		 }
		~DataStore()
		 {
		 	//删除链表中所有的结点,并把所有malloc的内存都释放掉 
		 }
	private:
		Student m_head;
 };
 

.h/.cpp分离式写法:与之前类的成员函数写法类似。

class DataStore{
 	public:
 		DataStore();
 		~DataStore();
 };
 
 DataStore::DataStore()
 {
 	
 }
 DataStore::~DataStore()
 {
 	
 } 

三.构造与析构的深究
1.
我们把不要传参的构造函数叫做默认构造函数
例如,之前举过的例子
Circle()
或者 构造函数的所有参数都有缺省值
Circle(int x=10,int y=5)
有了默认构造函数,在构造时就可以不传参。

默认构造函数很重要,如果一个类没有默认构造函数,则无法构造数组
例如:

class Object
{
	public:
		Object(int x){
		}
 } ;
 
 Object obj[4];   //错误!! 

如果一个类没有定义任何构造和析构函数,编译器会默认为我们加一个

2.考虑成员变量也是一个 class类型时

class Child
{
		
	public://以下就是析构函数 
	    Child()
		{
			printf("Child:创建\n");
		    
		}
		Child(int x,int y)
		{
			printf("Child:创建\n");
		    
		}
		~Child()
		{
			printf("Child:销毁\n");
		    
		}
	
};

class Circle
{
		
	public://以下就是析构函数 
		Circle()
		{
			printf("Circle:创建\n");
		    
		}
		~Circle()
		{
			printf("Circle:销毁\n");
		    
		}
	private:
	    Child m_circle; 
	    int x,y;
	
};

int main()
{
	{
		Circle obj;
	}

	printf("---------------\n");
	return 0;
}

结论:
构造的时候
(1)成员被依次构造:从前往后
(2)先执行成员的构造函数在执行自己的构造函数
析构的时候
(1)成员被依次析构:从后往前
(2)先执行自己的析构,在执行成员函数的析构

3.初始化列表:可以在构造函数后面直接初始化
(1)以冒号引导
(2)使用小括号来初始化

//基本类型的初始化 
class Object
{
	public:
		Object(): x(1),y(2)
		{
			
		}
 } ;
 
//class类型的初始化
 class Object
 {
 	public:
 		Object(): m_circle(1,2)
 		{
 			
		 }
 }; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值