一、引用
1、引用的定义
引用是C++中的一个很重要的概念,引用不是新定义了一个变量,而是给已经存在的变量取了一个别名,实际上编译器并不会为它分配新的内存空间,它和它所引用的变量使用同一块命名空间。
其语法为:类型& 引用变量名(对象名) = 引用实体;
void TestFun() {
int a = 10;
int& ra = a;
cout << a << endl;
cout << ra << endl;
cout << &a << endl;
cout << &ra << endl;
}
int main() {
TestFun();
return 0;
}
由此可见 ,二者的值是相同的,地址也是相同的!!!
2、引用的特性
1、引用在定义的时候必须进行初始化;
2、一个变量可以有多个引用;
3、引用一旦拥有一个实体之后,就不能在引用别的其他实体;
void TestFun(){
int a = 10;
//int ra&; //这句话是错误的!引用定义时必须进行初始化
int& rra = a;
int& rrra = a;
}
3、常引用
//常引用
void TestFun() {
const int a = 10;
//int& ra = a;
const int& ra = a;
}
4、引用的使用场景
1、做参数
//引用作为参数
void Swap(int& a,int& b) {
int temp = a;
a = b;
b = temp;
}
2、做返回值
int& TesrFun1(int& a) {
a += 10;
return a;
}
3、一段有意思的代码!!!
int& Add(int a,int b) {
int c = a + b;
return c;
}
int main() {
int& ret = Add(1,2);
Add(3, 4);
cout << ret << endl;
system("pause");
return 0;
}
结果等于 7 !!! 而不是 3 !!!
详情参考:https://blog.csdn.net/qq_40550018/article/details/81225519
注意:如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型返回。如果以引用类型返回,返回值的声明周期必须不受函数的限制(即比函数生命周期长);
5、引用和指针的区别
- 引用在定义的必须初始化,指针没有要求;
- 引用在初始化引用一个实体之后,就不能在引用第二个实体,而指针可以在任何时候指向任何一个同类型的实体;
- 没有NULL引用,但是有NULL指针;
- 在sizeof中含义不同:引用结果为所引用的实体类型的大小,但是指针始终是地址空间所占字节个数(32位系统下占4个字节);
- 引用自增加即引用的实体自增加,指针则是在原指针所指向的位置向后偏移一个位置;
- 有多级指针,但是没有多级引用;
- 访问实体的方式不同,指针需要显示解引用,引用则由编译器自行处理;
- 引用比指针使用起来相对安全;
二、内联函数
在C++中以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,属于一种以空间换时间的当时,提升了程序允许的效率;
注意:因为内联函数是在函数调用的地方进行展开,以空间换时间,所以代码很长或者有循环/递归的函数不适宜使用内联函数。当然这种情况,编译器有的时候也会进行自动优化,比如如果定义位inline的函数体内有循环/递归等,编译器优化时会忽略掉内联。
三、auto关键字(C++11)
auto这个关键字在早期的版本中:使用auto修饰的变量,都是具有自动存储功能的局部变量;
C++11:auto不再是一个存储类指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
我们看一段代码就可以直到,auto的神奇用法:
int Test() {
return 10;
}
int main() {
int a = 10;
auto b = a;
auto c = 'a';
auto d = Test();
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
return 0;
}
但是auto也有几个非常值得注意的地方:
- auto在定义变量的时候必须对其进行初始化,auto他并非是一种“类型”的声明,而是一个占位符,编译器会在编译期间把他替换成变量的实际类型;
- auto不能作为函数的参数使用,因为编译器无法对函数参数的实际类型进行推导;0
四、基于范围的for循环(C++11)
for循环后的括号由冒号“:”分为两个部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围;
int main() {
//遍历一个数组
int array[] = {1,2,3,4,5,6,7,8,9};
for (auto e : array)
cout << e << "";
cout << endl;
system("pause");
return 0;
}