临时对象与const

临时对象(临时变量)

临时变量在代码中不体现,并且也没有名字的变量

临时对象的产生条件(2):

  • 函数调用时所发生的隐式类型转换
  • 调用函数产生的返回值

核心:临时对象天生规定是const类型,因此在进行对临时变量进行传参或者修改值是会发生一些错误,比如:

string foo();
bar(string &a);
bar(foo());//非法操作,像这种就是明显的不熟悉临时对象的特点

让我们来详细理解一下上述代码

  1. 函数返回临时对象:

foo() 是一个返回 string 对象的函数。当调用 foo() 时,它会返回一个临时的 string 对象。在C++中,临时对象是 const 类型的,这意味着它们不能被修改。

  1. 函数参数类型:

bar(string& s) 这个函数的参数是一个非 conststring引用。这意味着 bar 函数期望接收一个可以修改的 string 对象的引用。

  1. 问题所在:

当你调用 bar(foo()) 时,foo() 返回的是一个临时的 string 对象。由于临时对象是 const 的,你不能将一个 const 临时对象传递给一个期望 非const 引用的函数参数。

换句话说,bar 函数期望接收一个可以修改的 string 引用,但你传递给它的是一个不可修改的临时对象,这会导致编译错误。

  1. 解决方法:

如果想要 bar 函数能够接受临时对象,可以将参数改为 const 引用,即 void bar(const string& s)。这样,bar 函数就可以接受临时对象,因为它承诺不会修改传入的 string 对象。但与此同时参数不可更改

上述解释的核心点在于把一个 const引用绑定到给一个 非const 引用类型是不允许的

搞清const变量拷贝和const引用绑定

!但请千万注意,以上内容都是基于 const引用 来说明的,并不说明 const 类型的变量不可以赋值给 非const 类型

  • const 类型赋值给非 const 类型
    直接赋值(值拷贝)是允许的:
const int x = 10;
int y = x;  // 正确:const 的值可以拷贝给非 const 变量

这里,x 是一个 const 变量,它的值被拷贝到非 const 变量 y。这是允许的,因为拷贝操作不会影响原始的 const 变量。

  • 绑定引用是不允许的:
const int x = 10;
int& y = x;  // 错误:不能将 const 绑定到非 const 引用

这里,x 是一个 const 变量,尝试将其绑定到非 const 引用 y 会导致编译错误。这是因为如果允许这样做,就可以通过 y 修改 x,从而破坏 const 的承诺。

  • 为什么绑定引用不允许?
    const 是一种承诺,表示“我不会修改这个值”。

如果将 const 变量绑定到非 const 引用,就相当于允许通过该引用修改 const 变量,这违反了 const 的语义。

准确的表述
允许:将 const 类型的值拷贝给非 const 变量。
不允许:将 const 类型的变量绑定到非 const 引用。

总结

值拷贝:const 的值可以赋值给非 const 变量,因为这只是复制值,不会影响原始的 const 变量。

引用绑定:const 的变量不能绑定到非 const 引用,因为这会允许通过引用修改 const 变量,违反 const 的语义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值