本文参考了 ===》C++ 中的 const & (常引用)参数 - 知乎
因为博文写的很详细,所以博主按着自己的理解写了demo, 和一些方便自己理解的备注。
自学的时候看到了下面这个代码,所以 const&是啥
首先,一句话告诉你 这个叫做常引用
const int& 和 int const& 是一样的效果。
我举个例子,一个函数里面改变了值输出
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
void CYC(int x){
x=3;
cout <<x<<endl;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
CYC(a);
cout << a<<endl;
}
因为x对a进行了深度拷贝,你可以理解成复制了一个 b=10,然后函数里b=3,打印b,这就跟a没关系,不改变a的值
嗯,然后你看下面的例子
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
void CYC(int& x){
x=3;
cout <<x<<endl;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
CYC(a);
cout << a<<endl;
}
嗯, &引用,可以理解成 cyc里是 a=3;
例1的深拷贝是要开辟内存的, 例2的引用 不用开辟内存。
看了上面两个例子,我们看下面的例子
下面这是常量的引用,被const定义的是常量,不能修改值。!!!!,所以函数内不能重新定义
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
void CYC(const int& x){
// x=3; 因为是常量,所有你x不能给他赋值
cout <<x*3<<endl;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
CYC(a);//这里
}
你也可以写成 const& ,一样的意思
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
void CYC(int const& x){
// x=3; 因为是常量,所有你x不能给他赋值
cout <<x*3<<endl;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
CYC(a);//这里
}
然后返回值,看下面这个例子
#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
int CYC(int const& x){
// x=3; 因为是常量,所有你x不能给他赋值
return x*3;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
cout <<CYC(a);
}
我们是让他返回int型,是有一个返回复制了 x*3(也就是返回复制了a*3)的过程,而你返回引用则不会
1、返回类型不是引用:在调用函数的地方会将函数返回值复制给临时对象
2、返回引用:当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。
所以就有了如下图操作
发现没,x是报错的
被复制的值是常量,必须为左键,那什么是左键
int a=1
a是左键被赋值变量,1是右键,是值,
而我们函数cout <<CYC(a);你就可以理解成 左边cout是a, cyc(a)是1,于是,我们加了一个常量申明
#include <iostream>
#include <windows.h>
using namespace std;
const int& CYC(int const& x){ //int const&
// x=3; 因为是常量,所有你x不能给他赋值
return x+3;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
cout <<CYC(a);
}
报错!!!!为啥!!!
因为const的缘故,你必须返回常量!!!!而行参里面是const int&也就是说你必须返回常引用,而你返回的是x+3或者x+4这种是变量(变量这个词只是为了方便理解!)。
所以结果就变成啥了,变成你只能传啥返回啥!!! 所以你要自己写模板啥的不建议给这个地方定义常整形,(博主自以为,欢迎反驳)
#include <iostream>
#include <windows.h>
using namespace std;
const int& CYC(int const& x){ //int const&
// x=3; 因为是常量,所有你x不能给他赋值
return x;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
cout <<CYC(a);
}
我这个函数当然也可以写成 int const& 如下
#include <iostream>
#include <windows.h>
using namespace std;
int const& CYC(int const& x){ //int const&
// x=3; 因为是常量,所有你x不能给他赋值
return x;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
int a=10;
cout <<CYC(a);
}
这种传入常引用类型,返回常引用的能用来干啥,博主举个例子吧
#include <iostream>
#include <windows.h>
using namespace std;
int const& CYC(int const& x,int const& y){ //int const&
// x=3; 因为是常量,所有你x不能给他赋值
return x>y?x:y;
}
int main()
{
SetConsoleOutputCP(65001);
//字符串
cout <<CYC(10,15);
}
嗯,我想大家心里应该就有数了