C++#2(new和delete的使用;引用)

 

目录

一、new and delete

 二、delete

 三、引用

作用:给变量起别名

 值传递(形参无法修饰实参)

为什么值传递中形参不能修饰实参?

 地址传递

 为什么地址传递形参可以修饰实参?

引用传递 

 为什么引用传递形参可以修饰实参?

四、 引用作为返回类型

 五、引用的本质

引用的本质是一个指针常量​编辑

 六、常量引用


一、new and delete

new用来开辟空间(在堆区),new后加开辟空间的类型

delete用来释放空间

#include<iostream>		//引用文件
using namespace std;

int* Abc()	//int* 类型的函数,说明返回类型是int*
{
	int* a = new int(5);//开辟空间
	return a;
}
void Test1()
{
	int* p = Abc();	//用int* 来接收

	cout << *p << endl;	//打印
	cout << *p << endl;
	delete p;	//delete 释放空间

	cout << *p << endl;//在delete释放空间后再去访问p的地址,就是非法访问
}
int main()
{
	Test1();	//调用函数

	system("pause");

	return 0;
}

 二、delete

delete在释放数组空间的时候,必须在delete后加[ ]

#include<iostream>		//引用文件
using namespace std;

void Test2()
{
	int* pa = new int[10];
	for (int i = 0; i < 10; i++)
	{
		pa[i] = i + 100;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << pa[i] << endl;
	}

	delete[]pa;//必须加[],不然delete无法释放整个数组
}
int main()
{
	Test2();	//调用函数

	system("pause");

	return 0;
}

 三、引用

作用:给变量起别名

语法:数据类型 &别名 = 原名;  //原名和别名类型要一致,别名指向的是原名的地址,无论哪一个改动都会改动到另一个

注意:1、必须初始化(不能注意写:数据类型 &别名;//这是错误的)

           2、初始化后不可以改变(不能改变的意思是:不能当其他变量的别名,可以进行赋值操作)

值传递

地址传递

引用传递

 基本语法

#include<iostream>
using namespace std;

int main()
{
	int i = 5;
	int &n = i;
	cout << "i = " << i << endl;
	cout << "n = " << n << endl;
	n = 10;
	cout << "i = " << i << endl;
	cout << "n = " << n << endl;

	system("pause");

	return 0;
}

 注意:

 值传递(形参无法修饰实参)

为什么值传递中形参不能修饰实参?

因为值传递中形参就相当于一个局部变量,离开函数就会自动销毁,所以无法改变实参 

 地址传递

 为什么地址传递形参可以修饰实参?

因为形参和实参地址指向的是同一块空间,所以形参修改空间内的数值,实参也会随着改变

引用传递 

 为什么引用传递形参可以修饰实参?

因为引用传递中,形参中的a相当于实参中的a的别名,所以改变形参中a的值也就是改变实参中a的值

四、 引用作为返回类型

 

为什么会出现这种情况?

因为a创建在函数Test1()里,属于局部变量,存储在栈区中,出了函数后空间就会被释放掉 ,所以要在int a起那么加static,将其变为全局变量,存储在静态区,这样出了函数空间后空间也还在

 

#include<iostream>
using namespace std;
#include<string>

int& Test2()
{
	static int a = 10;
	return a;
}
int main()
{
	int& b = Test2();
	
	cout << "b = " << b << endl;
	cout << "b = " << b << endl;

	Test2() = 100;
	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

 五、引用的本质

引用的本质是一个指针常量

编译器检测到引用后会进行自动转化,将int& b = a;会转化为int* const b = &a;

将b转化为*b

同时因为有const所以引用只能指向一个地方

 六、常量引用

 

 加const后为什么可以了?

加const后编译器会将代码转化为

int temp(编译器自动设置的变量) = 5;int * const a = &temp;

 修饰形参

因为没有加const,所以形参的值可以改变

 加了const之后,形参就不能改变,防止出现误操作

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值