12.构造函数与析构函数

12.构造函数与析构函数

1.构造函数
  • 构造函数的作用:用于对象的初始化
  • 构造函数的语法:

(1) 函数名是类名
(2) 构造函数没有返回值类型
(3) 构造函数中可以有多个形参,也可以没有形参

2.构造函数的调用
  • 分别演示无参构造函数,单个参数构造函数,多个参数构造函数的调用
class CStudent
{
public:
	//无参构造函数
	CStudent()
	{
	}
	//一个参数构造函数
	CStudent(int id)
	{
	}
	//多个参数构造函数
	CStudent(int id, char* name)
	{
	}
peivate:
	int m_ID;
	char m_Name[255];
};

int main()
{
	//无参构造函数的调用
	CStudent stu1;
	//一个参数构造函数的调用
	CStudent stu2 = 1;
	CStudent stu3(1);
	CStudent stu4 = CStudent(1);
	//多个参数构造函数的调用
	CStudent stu5(1,"lily");
	CStudent stu6 = CStudent(1"lily";
}
  • 构造函数允许函数重载,因此上面例子中我们可以实现无参,单个参数以及多个参数构造函数。当我们没有定义构造函数时,编译器会创建默认构造函数
  • 默认构造函数是无参构造函数,并不实现任何功能,也没有初始化的作用
  • 类在实例化创建对象时必须要有构造函数,即使我们不写构造函数,编译器也会为我们创建默认构造函数
  • 但是当我们定义了构造函数(j假设有形参)时,编译器就不会再为我们创建构造函数,此时如果再使用无参的默认构造函数就会编译出错
  • 当我们创建构造函数,并且没有添加任何关键字的情况下,默认有两种调用构造函数的方式,一种是显示调用,另一种是隐式转换
	CStudent stu2 = 1;//隐式转换调用构造函数
	CStudent stu3(1);//显示调用构造函数
  • 但是当我们在构造函数前添加explicit关键字后,该构造函数就只允许显示调用,不允许隐式转换的调用
  • = default; 表示使用默认构造函数
  • =delete; 表示禁止使用某函数(删除)
class CStudent
{
public:
	//CStudent() = default;//显式的写出使用默认构造函数
	CStudent() = delete;//不使用默认的构造函数
peivate:
	int m_ID;
	char m_Name[255];
}

int main()
{
	CStudent stu;//如果类中没有书写其他构造函数,又使用 = delete;禁止了默认构造函数的使用,此时类的实例化会报错
}
3.析构函数
  • 析构函数的作用:完成资源的反初始化,资源的释放
  • 析构函数的写法:
    1.类名前加~
    2.通常是由编译器决定调用时机,不需要手动调用
    3.析构函数不能有参数和返回值
  • 析构函数不能重载
    特别注意

通常情况下析构函数由编译器决定调用时机,但是我们能不能手动调用析构函数呢?
答案是可以的,但是特别注意,默认情况下系统会为我们调用一次析构函数,如果我们自己调用,有可能会造成堆空间的重复释放而报错。

int main()
{
	CStudent stu;
	stu.~CStudent();//手动调用析构函数
	//一般在程序即将退出前系统会调用一次析构函数,此时可能就会造成堆空间的重复释放
	return 0;
}
4.构造函数与析构函数调用时机
  • 栈上的局部对象(main函数中的对象,块作用域内的对象,函数中的对象)调用时机:

构造:声明该对象的构造时调用
析构:对象出作用域时调用

  • 全局对象的调用时机:

构造:进入main函数之前
析构:出main函数之后

5.构造函数与析构函数访问权限
  • 构造函数与析构函数必须是public访问权限
  • 如果认为写成private访问权限,或者不写明访问权限(即类中默认是私有访问权限)的情况下,因为类的外部无法访问构造函数,会造成无法使用该类创建对象的情况

补充知识点:

malloc()

  • C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针
  • size – 内存块的大小,以字节为单位
  • 该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main()
{
   char *str;
 
   /* 最初的内存分配 */
   str = (char *) malloc(15);
   strcpy(str, "runoob");
   printf("String = %s,  Address = %u\n", str, str);
 
   /* 重新分配内存 */
   str = (char *) realloc(str, 25);
   strcat(str, ".com");
   printf("String = %s,  Address = %u\n", str, str);
 
   free(str);
 
   return(0);
}

String = runoob,  Address = 3662685808
String = runoob.com,  Address = 3662685808
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值