C++ const 形参和实参的类型问题

发布于 2022-09-04 13:14:24 字数 789 浏览 25 评论 0

最近在学习C++ Primer 5th(英文版), 函数(章节6),P.216。这里有一个例子如下:

voide fcn(const int i) //fcn can read but not write to i。

按照书上自己的定义(P.203),函数的形参和实参的类型必须是匹配的,或者有形参的隐式转换。那么对这个例子来说,我的思路是:

  • 这里是值传递,那么fcn会创建一个实参的拷贝parameter。

  • 如果这个parameter 是const int类型,那么很显然这个复制是不能完成的。(const

  • 因此那么这个parameter 只能是普通的int类型,top_level const被忽略掉了。

我写了一段代码来测试,编译器报错说不能对只读形参操作。

#include <iostream>
using namespace std;
void const_parameter(const int i);
int main(int argc, char const *argv[])
{
    const int a = 1;
    const_parameter(a);
    return 0;
}
void const_parameter(const int i){
    ++i; // try to modify parameter i but failed.
}

我的问题是,为什么这里是只读形参?如果是只读形参,那这个只读形参是怎么接受实参的拷贝的?谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

若水般的淡然安静女子 2022-09-11 13:14:24

回头再看了一下自己刚才的思路,其实在第二步就有一个非常大的问题,弄混了const的 initialization 和 assignment。在 pass by value 这个过程中,进行的操作其实是用 argument 对 parameter 进行初始化,而不是 assignment。而对于const来说,初始化的时候是允许给一个const类型的初始值的,比如:

const int i = 10;
const int j = i; //no problem at all!

所以先前 function 里的这个 parameter 的定义已经很清楚了,不管你怎么转换,不管你 argument 里是啥值,来了都得给我变成const int类型,这也是为什么i不可写的原因。
真是不写程序不知道自己有多蠢啊。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文