1. 内存分配
1.1 面试题:
C语言里的malloc和free与C++里的new和delete有什么区别?
C语言:
malloc:用于动态内存分配
free:释放动态内存
C++:
new:用于动态内存的申请
delete:用于释放申请的动态内存
1)C语言中malloc和free适用于内置的数据类型,C++中的new和delete不仅适用于内置的数据类型,还适用于自定义的类型(类类型)
2)C语言中使用malloc时,需要进行强转,但C++使用new不需要强转
3)C语言中使用malloc申请空间时需要指定空间大小,但new不需要指定大小
4)C语言中的malloc是函数,而new不是函数,其实质就是一个操作符
5)C语言中的malloc申请空间时没有向空间中存放初始值,但new申请空间时可以存放初始化值
1.2 new和delete的使用:
new申请变量地址空间
格式:
数据类型(内置的数据类型和自定义的类型) * 标识符 = new 数据类型;
或
数据类型(内置的数据类型和自定义的类型) * 标识符;
标识符 = new 数据类型;
释放申请的空间:
格式:
delete 标识符
例如:
delete p;
例如
int * p = new int ; //在堆区new了int大小的空间,并用指针变量p指向该空间
int * p ;
p= new int;
People类型
People * people = new People ; //申请People大小的空间,并用people指向该空间
例如:
delete p;
1.3 new申请空间时向空间存放初始值
格式:
数据类型(内置的数据类型和自定义的类型) * 标识符 = new 数据类型(初始值);
或
数据类型(内置的数据类型和自定义的类型) * 标识符;
标识符 = new 数据类型(初始值);
例如:
int * p = new int(50) ; //在堆区new了int大小的空间,并用指针变量p指向该空间,并且向空间中存放初始值50
或
int * p ;
p= new int(50);
1.4 使用new开辟数组空间
格式:
数据类型(内置的数据类型和自定义的类型) * 标识符 = new 数据类型 [ 数组的大小];
或
数据类型(内置的数据类型和自定义的类型) * 标识符;
标识符 = new 数据类型[ 数组的大小];
例如:
int * p = new int[5] ; //在堆区new了5个int大小的空间,并用指针变量p指向该空间
或
int * p ;
p= new int[50];
1.5 new申请数组空间时存放初始值
格式:
数据类型(内置的数据类型和自定义的类型) * 标识符 = new 数据类型 [ 数组的大小]{初始值1,初始值2,........};
或
数据类型(内置的数据类型和自定义的类型) * 标识符;
标识符 = new 数据类型[ 数组的大小]{初始值1,初始值2,........};
例如:
int * p = new int[5]{1,2,3,4,5} ; //在堆区new了5个int大小的空间,并用指针变量p指向该空间
或
int * p ;
p= new int[5]{1,2,3,4,5};
释放空间:
格式:
delete [] 标识符;
例如:
delete [] p;
1.6 例
#define _CRT_SECURE_NO_WARNINGS 1
#include "iostream"
using namespace std;
//动态开辟空间
int main()
{
//不带初始值的动态开辟
int* p = new int;
*p = 20;
cout << "p=" << *p << endl;//20
//带初始值的动态开辟
int* q = new int(30);
cout << "q=" << *q << endl;//30
//动态开辟数组(不带初始化值)
int* p1 = new int[5];
for (int i = 0; i < 5; i++) {
p1[i] = i + 1;
}
for (int i = 0; i < 5; i++) {
cout << "数组:" << p1[i] << endl;
}
cout << endl;
//动态开辟数组(带初始化值)
int* p2 = new int[5] {1, 2, 3, 4, 5};
for (int i = 0; i < 5;i++) {
cout << "数组:" << p2[i] << endl;
}
//释放
delete p;
delete q;
delete[]p1;//释放数组空间
delete[]p2;
return 0;
}
2. 动态开辟
main3.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "iostream"
using namespace std;
//动态开辟空间
int main()
{
//不带初始值的动态开辟
int* p = new int;
*p = 20;
cout << "p=" << *p << endl;//20
//带初始值的动态开辟
int* q = new int(30);
cout << "q=" << *q << endl;//30
//动态开辟数组(不带初始化值)
int* p1 = new int[5] {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
p1[i] = i + 1;
}
for (int i = 0; i < 5; i++) {
cout << "数组:" << p1[i] << endl;
}
cout << endl;
//动态开辟数组(带初始化值)
int* p2 = new int[5] {1, 2, 3, 4, 5};
for (int i = 0; i < 5;i++) {
cout << "数组:" << p2[i] << endl;
}
//释放
delete p;
delete q;
delete[]p1;//释放数组空间
delete[]p2;
return 0;
}
3. C++里的作用域:
(1)局部作用域
数据存在于代码块内部的区域,称之为“局部作用域”,数据在当前代码块中有效,超出代码块的区域就失效
(2)全局作用域
数据存在于文件中即代码块的外部,称之为“全局作用域”,数据对于整个文件都是有效的
(3)命名空间作用域
是全局作用域的一部分,数据存在于命名空间中只对该空间有效,超出则无效
(4)类作用域
是全局作用域的一部分,数据存在于类中,只读该类是有效,超出则失效