打印
[菜农助学交流]

问大家一个c++问题

[复制链接]
2518|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tendence|  楼主 | 2011-12-3 20:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这个c++程序
 
#include <iostream>
using namespace std;
int test(int & i)
{
return i;
}
int main()
{
    short i=10;
    cout<<test(i)<<endl;
    return 0;
}

不能编译通过,以为connot convert parameter form 'short' to ‘int&’
但是加上const就可以了
 
#include <iostream>
using namespace std;
int test(const int & i)
{
return i;
}
int main()
{
    short i=10;
    cout<<test(i)<<endl;
    return 0;
}

谁能解释一下,为什么加了const就可以编译成功了

相关帖子

沙发
john_lee| | 2011-12-3 22:51 | 只看该作者
先给出原因:C++禁止为非常量引用(reference-to-non-const)产生临时对象。

test() 函数的参数要求一个 int 型引用,而调用时给的参数 i 却是 short 型,如果直接把 i 的引用传递给 test(),并且 test() 修改了引用的值,这将会把与 i 相邻数据也覆盖了,所以,C++ 不会直接把 short i 的引用传递给 test(),而是对 short i 创建一个 int 型的临时对象,将这个临时对象的引用传递给了 test(),这样就安全了。

但是,test() 的参数却是一个非常量引用,这正好违反了 C++的规则,编译器当然就会报错了。

后来楼主加上了 const,这就符合了规则,编译当然也就通过了。

使用特权

评论回复
板凳
hotpower| | 2011-12-4 00:37 | 只看该作者
谢谢老师!绝对专业,绝对给力!

使用特权

评论回复
地板
tendence|  楼主 | 2011-12-4 09:55 | 只看该作者
2# john_lee
老师讲解得真是专业,比《C++ Primer》讲得都深入
《C++ Primer》上给出了经验性的表述:
应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。

使用特权

评论回复
5
zjsyjbb| | 2011-12-4 12:09 | 只看该作者
学习了..:)

使用特权

评论回复
6
tendence|  楼主 | 2011-12-4 12:59 | 只看该作者
老师真的很牛啊!

使用特权

评论回复
7
Ryanhsiung| | 2011-12-4 14:28 | 只看该作者
学习

使用特权

评论回复
8
2点零2| | 2011-12-9 15:18 | 只看该作者
2L解释的很到位啊。。。
如果可以的话,楼主还是在C++里面多使用const吧,多多益善!!!

使用特权

评论回复
9
tendence|  楼主 | 2011-12-24 14:15 | 只看该作者
2L解释的很到位啊。。。
如果可以的话,楼主还是在C++里面多使用const吧,多多益善!!!
2点零2 发表于 2011-12-9 15:18
const的使用注意事项还是非常多的,不敢用太多。

使用特权

评论回复
10
hotpower| | 2011-12-25 07:23 | 只看该作者
欢迎大家听每周2次的群课: 菜农助学群校:134915667

每次新浪微群也有直播:菜农助学群校

本园地也会有群课笔记上传的。

使用特权

评论回复
11
莱农电工| | 2011-12-25 23:04 | 只看该作者
有老师的知道就是高效!!

使用特权

评论回复
12
X-Hawk| | 2011-12-27 00:51 | 只看该作者
const有人喜欢,有人认为是毒瘤。
连C++标准库都受其害,iterator之外,搞出个const_iterator,
再搞出个const_reverse_iterator
疯了,不就是想代替个指针吗。。

使用特权

评论回复
13
肖肖~| | 2018-12-12 15:54 | 只看该作者
大神,如何正确的通过 C++ Primer 学习 C++? 本人即将读研,虽然考的是本专业(GIS),但是研究生读的专业在计算机学院,要求所有研究生都要会编程。本科期间学过C++,但是基本忘的差不多。现在暑假已经被要求到学院搞项目,但是因为对编程只有概念上的认识,所以现在都是在自学C++。这几天开始从头看C++ primer,但是因为基础实在薄弱,很多内容看很久都看不懂,上网查资料也是一片模糊。看了几天之后,觉得我学习的方法有问题(我是每天都在练习他的习题)。我知道学习程序语言要多敲代码,但是这个敲代码不知道从哪里入手,看书也不知道哪些是重点,哪些现在可以不看的。完全没有一个详细的规划,很乱。求大神给些意见!谢谢!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:把技术记在心里

1

主题

164

帖子

0

粉丝