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)类作用域
是全局作用域的一部分,数据存在于类中,只读该类是有效,超出则失效
  












![[Angular] 笔记 10:服务与依赖注入](https://img-blog.csdnimg.cn/direct/c5f4e7938b7a48cd999fdb21660c4127.png)






