本文主要是介绍1.26号c++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C++中动态内存分配和回收(堆区)
1> C语言中动态内存分配和回收使用的是malloc和free函数。
2> C++依然可以使用上述两个函数来完成。
3> C++也为用户提供了两个关键字new、delete来进行动态内存分配和回收。
分配
单个内存分配
格式: 数据类型 *指针名 = new 数据类型
eg: int *p1 = new int;
//在堆区空间申请了int类型大小的空间,并将该空间的地址赋值给p1
连续内存分配
格式: 数据类型 *指针名 = new 数据类型[个数]
eg: int *p2 = new int[5];
//在堆区空间连续申请了5个int类型大小的空间
回收
单个内存回收(释放)
格式:delete 指针名;
eg: delete p1;
连续内存回收
格式:delete []指针名
eg: delete []p2;
new、delete和malloc、free之间的区别(面试、笔试)
1.new、delete是关键字,而malloc、free是函数
2.new申请空间可以初始化,malloc不可以
3.new以数据类型为单位,malloc以字节为单位
4.new申请时,指针是什么,类型就是什么,malloc要强转
5.new可连续申请,malloc不可
6.new申请空间自动调用构造函数,malloc不会
7.delete自动调用析造函数,free不会
类中特殊的成员函数(重点)
1>特殊成员函数的种类:构造函数、析构函数、拷贝构造函数、拷贝赋值函数、移动赋值、移动拷贝、取地址符运算符重载、常取地址符运算符重载
2>特殊原因:
1)这些函数都是系统默认提供,无需程序员手动定义,如果程序员手动定义,则系统取消默认提供。
2)这些函数无需手动调用,在特定的情况下,系统自动调用,即使是程序员手动定义的函数。
构造函数
在给类实例化对象时,会自动调用构造函数来给类对象申请空间以及初始化使用。
格式
函数名:与类同名
返回值:无返回值 也无void
参数:可以无参数,可以有参数
访问权限:一般为public
类名(形参列表)
{
函数体内容;
}
调用时机
实例化对象时,就会自动调用构造函数
1>栈区
何时实例化对象,何时自动调用构造函数
2>堆区
何时使用new, 何时自动调用构造函数
注意
1> 类中,系统都会提供一个默认无参数的构造函数,如果程序员手动定义构造函数,则系统取消提供的无参构造函数,如果后期想使用无参构造函数,则需要将无参构造函数显性定义出来,否则报错。
2> 可以在构造函数中设置默认参数值。
初始化列表
构造函数的本身工作是给类对象申请空间的,而初始化工作是由初始化列表来完成。
初始化列表格式:
初始化列表是由构造函数形参小括号后面由冒号引出。
类名(形参1,形参2,形参3):成员变量1(形参1),成员变量2(形参2),成员变量3(形参3)
{
函数体内容;
}
初始化列表只有构造函数才有,其他普通函数没有。
必须使用初始化列表的情况:
1>当类中有引用成员时,对该成员的初始化必须使用初始化列表。
2>当类中有常成员变量时,对该成员的初始化必须使用初始化列表来完成。
3>当类中嵌套另一个类对象时,对该对象的初始化,必须使用初始化列表来完成。
析构函数
当类对象生命周期结束后,会自动调用析构函数,来给类对象回收资源(释放空间)。
函数名:~类名
返回值:无返回值,也无void
参数:无参数
访问权限:一般为public
~类名()
{
函数体内容
}
调用时机
当类对象生命周期结束后,会自动调用析构函数。
1>栈区
当类对象所在的函数结束时,会自动调用析构函数释放空间。
2>堆区
何时使用delete,何时自动调用析构函数。
小结
1> 类中都会有系统提供默认的析构函数,如果显性定义出析构函数,那么系统就取消默认提供。
2> 当类中有指针成员,并且指向堆区空间,那么此时就需要显性定义出析构函数,在析构函数中手动释放指针所指向的空间。如果使用系统提供的默认析构函数,则指针所指向的堆区空间就无法得到释放,从而造成内存泄漏。
3> 每个类中只有一个析构函数,原因:析构函数无参数,不能重载。
拷贝构造函数
拷贝构造函数是一种特殊的构造函数,使用一个类对象给另一个类对象进行初始化使用的。
格式
函数名:与类同名
返回值:无返回值,也无void
参数:同类的其他类对象
访问权限:一般为public
类名(const 类名 &other)
{
}
调用时机
1> 用一个类对象给另一个类对象初始化时,自动调用拷贝构造函数
2> 当类对象作为函数的形参时,实参传递给形参的过程中,自定调用拷贝构造函数
3> 当函数返回一个类对象时,自动调用拷贝构造函数
作业
这篇关于1.26号c++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!