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