C++入门基础(2)

目录

一、引用:

1、定义:

 2、特性:

 3、引用的使用:

4、const引用:控制权限

const引用定义:

const引用可以接收3种对象:

1、正常对象:

2、临时对象:

3、const对象:

总结:

5、引用与指针的关系:

二、内联函数:

​编辑 三、nullptr:

四、总结:


一、引用:

1、定义:

       ✨✨引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋⻛";林冲,外号豹⼦头✨对其修改是直接操作的,别名和本名就是指的一个对象✨✨


👉👉 类型& 引⽤别名 =  引⽤对象

 ✨✨引用的出现代替了指针,对引用进行修改,就相当于对本名(引用对象)进行修改

 2、特性:

//在定义时要初始化
//一个变量可以有多个引用
//引用一旦引用一个实体,再不能引用其他实体
//引用不能指向一个空对象,没有意义
//int& a = nullptr;//.引用必须初始化,所以不能为空引用,指针可以

✨✨初始化,决定了别名,该别名就一直是a的别名,不会发生更改


✨✨一个变量可以有多个别名,就像别人给你起外号有多个一样(随便起外号不是很礼貌哈)


 ✨✨已经有了实体了,不会引用其他的实体,这里只会将h的值赋值给b,直接就将a的值也改变

 3、引用的使用:

1. 引⽤在实践中主要是于引⽤传参引⽤做返回值减少拷⻉提⾼效率改变引⽤对象时同时改变被引⽤对象

2.引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。

3. 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点互相不可替代。C++的引⽤跟其语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,Java的引⽤可以改变指向。

4.⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针



4、const引用:控制权限

先补充一点说明:✨临时对象

临时对象:编译器需要⼀个空间暂存表达式的求值结果临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象;

✨👉🤔临时对象也就是存放一些结果的变量,使用完后会销毁

 C++规定:临时对象具有常性(只能读,不能改)

//表达式求值
// 1、a+b 表达式运算
// 2、int a = 1; double b = a;a转换成double型(隐式类型的转换)
//3、整形提升
//4、传值调用的返回值
//5、截断
//………………

const引用定义:

        可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访问权限在引⽤过程中可以缩⼩但是不能放⼤!!!!权限小了,也就是不能进行修改了

👉总之:引用可以引用 权限比自己大的,但是不能引用 权限比自己小的,自己的权限必须和引用对象的权限相同,或者比引用对象小!!

const引用可以接收3种对象:

1、正常对象:
int main()
{
	int a = 10;
	const int& b = a;//权限缩小
	return 0;
}

🧑‍🎓🧑‍🎓但是 b不能修改a的值因为此时b的权限缩小了《《只能读,不能修改

👉👉但是a可以进行修改

2、临时对象:
int main()
{
	double a = 10;
	const int& b = a;
	//int& b = a;不可以
	return 0;
}

🧑‍🎓🧑‍🎓临时对象具有常性,因为要发生隐式转换,对于常性,它的权限是只读不可改,那么我们就要一个只读不可改的引用即const引用


对于常量也可以使用引用,但是根据权限对应,需要使用const引用才行,当然也不能给常量进行修改

int main()
{
	//int& a = 10;错误的引用,常量的权限是只读不可改
	const int& a = 10;

	return 0;
}
3、const对象:
int main()
{
	const int a = 10;//具有了常属性
	const int& b = a;
	return 0;
}

🧑‍🎓🧑‍🎓对于const的对象进行引用时,必须用同等权限的引用,即const引用; 

总结:

const引用就是改变了引用的控制权限权限,其权限满足如下表达式

5、引用与指针的关系:

🧑‍🎓🧑‍🎓 C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥引⽤是弟弟,在实践中他们相辅相成功能有重叠性,但是各有⾃⼰的特点互相不可替代

 //语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。

//• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

//• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。

//• 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。

//• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)

//• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些

二、内联函数:

关键字inline + 函数声明

🧑‍🎓🧑‍🎓inline修饰函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率

🧑‍🎓🧑‍🎓inline对于编译器⽽⾔只是⼀个建议(我和你说一声,听不听,取决于你的想法,我无法左右你必须听我的),也就是说,你加了inline 编译器可以 选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。✨✨inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略展开太多了,代码量会太大✨✨

 ✨✨C语⾔实现宏函数也会在预处理替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的函数式宏

注意:inline不建议声明和定义分离到两个⽂件(分装),分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。


 三、nullptr:

C++中NULL可能被定义为字⾯常量0,或者 C中被定义为⽆类型指针(void*)的常量。🧑‍🎓🧑‍🎓不论采取何种定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦;

🧑‍🎓🧑‍🎓 C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型不能被转换为整数类型


🧑‍🎓🧑‍🎓C++不允许void*类型的数据给其他类型的指针,必须墙砖同类型;

void f1(int x)
{
	cout << "f(int x)" << endl;
} 
void f1(int* ptr)
{
	cout << "f(int* ptr)" << endl;
} 
int main()
{
	f1(0);// 
	f1(NULL);//相当于传一个常数0
	f1((int*)NULL);// f1((void*)NULL);将NULL强转为指针类型
	f1(nullptr);//空指针
	return 0;
}

nullptr相当于c语言中的NULL,但是不能转换成整形

四、总结:

 继续努力!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值