1.引用与指针的区别
引用和指针的不同点:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全
2.内联函数(inline)
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。
频繁调用函数,是需要建立栈帧,是有消耗的,如何解决?(空间换时间)
1.C语言是通过使用宏函数 2.C++使用内联函数
内联函数条件:
1.不能存在任何形式的循环语句
2.不能存在过多的条件判断语句
3.函数体不能过于庞大,不能对函数进行取址操作
4.有时候不加inline,也有而可能是内联函数,内不内联由编译器决定。
面试题:宏函数和内联函数的区别?
3.auto关键字(C++11)
auto类型推导 auto在实际场景中的应用,map容器可以体现一部分出来
auto不能推导的场景:
1.auto不能作为函数的参数
2.auto不能直接用来声明数组
ps:typeid(变量/对象).name() 可以用来查询变量/对象的类型
4.基于范围的for循环(C++11)
void TestFor()
{
int array[] = {1,2,3,4,5};
for(auto& e : array)
cout<< e <<endl;
}
5.指针空值nullptr(C++11)
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何 种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦。C++推荐使用nullptr。
注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。