C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用)
函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项)
C++类和对象—封装(属性和行为作为整体,设计学生类,访问权限,class和struct的区别,成员属性私有化,设计案例(1立方体类,2点和圆的关系(多文件编程)))
C++类和对象—对象特征(构造函数与析构函数,函数的分类以及调用,拷贝构造函数调用时机,构造函数调用规则,深拷贝和浅拷贝,初始化列表,类对象作为类成员,静态成员)
C++对象模型和this指针(成员变量和成员函数分开存储,this指针的用途,空指针访问成员函数,const修饰成员函数)
C++类和对象-友元(全局函数做友元,友元类,成员函数做友元)
C++ 模板学习01(函数模版)(函数模板的语法、函数模板注意事项、函数模板案例-数组排序、普通函数与函数模板的区别、普通函数与函数模板的调用规则、模板的局限性)
C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
引用的基本使用
引用的本质作用就是给一个变量起一个别名。
语法很简单,数据类型 &别名 =原名 看代码就行
当我们在程序中看到 int a=10时,首先应想到的是程序在内存条中开辟了一个四个字节大小的空间里面存放着10且用a来控制这段内存。所以我们就想能不能用一个新的其他的名字来控制相应的内存呢?引用的作用就出来了,我们可以试着用b来控制这一段内存(详细看代码)。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;//引用的初始化
cout << "a=" << a << endl;
cout << "b=" << b << endl;
b = 1000;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
引用的注意事项
引用必须初始化
int &b;//是错误的
引用在初始化后,不可以改变
当b成为a的别名以后,就不可以更改为c的别名了
引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
下面我们用值交换的例子直接用代码解释。
#include<iostream>
using namespace std;
void swap1(int a, int b)
{
int temp = a;
a = b;
b = temp;
}//值传递
void swap2(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}//地址传递
void swap3(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}//值传递
int main()
{
int a = 10;
int b = 20;
swap1(a, b);//值传递,形参不会修饰实参
cout << "swap1 a=" << a << endl;
cout << "swap1 b=" << b << endl;
swap2(&a, &b);//地址传递,形参会修饰实参
cout << "swap2 a=" << a << endl;
cout << "swap2 b=" << b << endl;
swap3(a, b);//引用传递,形参会修饰实参
cout << "swap3 a=" << a << endl;
cout << "swap3 b=" << b << endl;
return 0;
}
通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单。
引用做函数的返回值
作用:引用可以作为函数的返回值存在
注意:不要返回局部变量引用
用法:函数调用作为左值
#include<iostream>
using namespace std;
int& text1()
{
int a = 10;//局部变量存放在四区中的栈区
return a;
}
int& text2()
{
static int a = 10;//静态变量,存放在全局区,程序结束后才释放掉
return a;
}
int main()
{
int& ref = text1();
cout << "ref=" << ref << endl;//错误,a的内存已经释放
int& ref2 = text2();
cout << "ref2=" << ref2 << endl;//正常输出
text2() = 1000;//函数调用作为左值,a=1000
cout << "ref2=" << ref2 << endl;
return 0;
}
其中的 text2() = 1000;,因为text2函数本身就是一个引用,返回的是a值,这个代码其实上执行的就是a=1000;的操作,而ref2又是a的别名。
引用的本质以及常量引用
本质:引用的本质在c++内部实现是一个指针常量(指针常量是指针指向的内容可以修改,但是指针的指向不可以修改)
int& ref=a;会自动转换为 int*const ref =&a;也就说明了为什么引用不可更改
常量引用的作用:主要用来修饰形参,防止误操作
在函数形参列表中可以加const修饰形参,防止形参改变实参,简单来说就是用函数的时候不想改变某个值,为了防止误操作来保护的。
当代码这样 const int& ref = 10;
编译器就会将代码修改为这样 也就保证了值不会被改变了 int temp = 10; const int& ref = temp;