更易理解的C++入门下(C++关键字、引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

目录

1.C++关键字

2.引用

1.引用概念

2.引用特性

3.常引用

4.引用使用场景

5.传值和引用的比较

6.引用和指针的区别

3.内联函数

1.概念和内联函数与宏定义的对比

2.内联函数调试不展开的问题

3.内联函数不能将分明和定义分开

4.auto关键字

1.概念和使用

2.auto与指针和引用结合起来使用

3.auto不能推导的场景

5.基于范围的for循环(C++11)

6.指针控制nullptr(C++11)


1.C++关键字

2.引用

1.引用概念

 引用就是给一个变量起别名,类型+&

int a = 10;
int& b = a;
b = 20;

b是a的别名,b的改变影响a的改变,b = 20就是a = 20,b和a空间地址一样.

2.引用特性

1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体

3.常引用

const+类型+&

const int a = 10;
int& ra = a; // 该语句编译时会出错,a为常量

int& b = 10; // 该语句编译时会出错,b为常量

double d = 12.34;
int& rd = d; // 该语句编译时会出错,类型不同

错误在于权限的放大,const int权限小放大成int,权限不能放大,只能缩小。

类型不匹配,除非是常量,常量具有常属性,需要const修饰更加安全

在c语言中存在左右类型不匹配时,会根据右值需要改变的类型进行隐式强转单独开辟一块空间,不与原来的空间重叠

4.引用使用场景

1.可以作为参数,更优于指针,使用安全、方便,例如Swap(int& a,int& b)。

2.可以作为返回值,只要出了函数栈帧这个变量还存在并且权限是属于我们的,就可以作为返回值,例如在函数中定义static静态变量,如果是局部变量作为返回值,函数栈帧销毁时这块空间当然还存在,只不过权限是属于系统的,系统怎么分配我们不知道,这块空间将会是一个随机值,所以要传值,而不是传引用。

5.传值和引用的比较

传值需要再次拷贝,引用直接改变那块空间的值,引用效率高,传值效率低,具体效率可以使用clock函数在函数调用的上下写入,下clock减去上clock,通过clock来对比传值和引用的效率。

6.引用和指针的区别

C++是C语言的升级,语法上引用就是别名,与实体共用一块空间,底层上实际是有空间的,因为引用是按照指针方式来实现的,具体可以通过简单的指针该值和引用该值对比调试下的汇编代码。

1. 引用概念上定义一个变量的别名,指针存储一个变量地址.
2. 引用在定义时必须初始化,指针没有要求.
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体.
4. 没有NULL引用,但有NULL指针.
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节).
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小.

7. 有多级指针,但是没有多级引用.
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理.
9. 引用比指针使用起来相对更安全.

3.内联函数

1.概念和内联函数与宏定义的对比

inline 内联函数,将函数展开,空间换时间

没有函数栈帧的开销,C语言中宏定义也是没有开销,但是宏定义1.不能调试,2.没有检查,不安全(例如double传成int)3.容易写错(替换),可以复习写一下宏定义的ADD,基于不稳定宏定义的因素inline自此出现

int ADD(a,b) ((a) + (b))
//宏定义在预处理时替换,如果少些括号会存在操作符优先级带来的不安全性
//传参类型没有检查也会有不安全性
//预处理时直接替换不能调试,不方便找出错误

2.内联函数调试不展开的问题

debug版本不展开,为了调试

可以通过设置使内联函数展开

右键项目名属性打开窗口

依次点击C/C++,调式信息格式改为程序数据库、优化中启用内部函数改为只适用于inline

内联函数在调用的地方长就不展开,短就展开,根据编译器而定.

3.内联函数不能将分明和定义分开

内联函数是不存入符号表里的,因为他是展开的,而不是通过函数名和地址来调用的,预编译把头文件展开,编译器看到函数的声明就让过,各个函数都是相互独立的不进行相互操作,链接的时候通过符号表(函数修饰名+地址)进行调用,内联函数分明定义分开,是没有建立栈帧,也不会通过函数名从符号表里找地址,都没开辟栈帧就不会有函数修饰名和地址存入符号表,所以内联函数的声明和定义分开,会报链接错误。

4.auto关键字

1.概念和使用

随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
1. 类型难于拼写
2. 含义不明确导致容易出错

所以auto关键字会自动识别类型赋予变量,当然auto必须初始化。

auto a = 10;//int
auto b = 1.1//默认double,1.1f可以设置成float

2.auto与指针和引用结合起来使用

1.指针的auto和auto*没有区别,但用auto声明引用类型时必须加&

2.auto一次性定义多个变量时,类型必须统一,因为编译器实际只对第一个类型推导,然后以推导出来的类型来定义其他变量,类型不统一则会报错。

3.auto不能推导的场景

1. auto不能作为函数的参数
2. auto不能直接用来声明数组
3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
4. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有
lambda表达式等进行配合使用。


5.基于范围的for循环(C++11)

类型+需要接收值的迭代变量名:赋值的范围

int array[] = {1,2,3,4,5};
for(int e:array)
cout<< e <<" "<<endl;

其中int写为auto是最好的,因为自动识别类型更好用,e是迭代变量名,名字可以任意更改,array就是范围,e迭代的值就是从array当中依次拿到的值。

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

6.指针控制nullptr(C++11)

typeid 得到一个变量的类型转化成字符串

c++中,NULL是0,nullptr等价于(void*)0以关键字的形式存在于标识符常量中

所以在使用C++语言时不用C语言的NULL而用C++的nullptr。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值