const&和int& const 理解笔记(图、代码、讲解)

本文参考了 ===》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);
}

嗯,我想大家心里应该就有数了

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪狼之夜

打个赏,让博主知道博文没白写

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值