问const的问题

GreenCircle 2008-12-28 12:23:12

#include <iostream>
using namespace std;

template <class T>
T cal(T &a, T &b, T &c)
{
return a + b + c;
}

int main()
{
int a = 5, b = 4, c = 3, i =5;

while(i--)
{
cout << cal(a++, b++, c++) << endl;
}

return 0;
}

这段代码就运行不了,然后我加上const就可以了,这是为什么呢?谢谢了

#include <iostream>
using namespace std;

template <class T>
T cal(const T &a, const T &b, const T &c) // 分别加上const
{
return a + b + c;
}

int main()
{
int a = 5, b = 4, c = 3, i =5;

while(i--)
{
cout << cal(a++, b++, c++) << endl;
}

return 0;
}
...全文
71 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
GreenCircle 2008-12-29
  • 打赏
  • 举报
回复
嘿嘿,谢谢6楼了,我下次问问题再给你加分,这次我在你发贴之前就结贴了,不过还是要谢谢你,你写的很有用:)
GreenCircle 2008-12-28
  • 打赏
  • 举报
回复
哦,这样啊,谢谢了 :)
nullah 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyisnail 的回复:]
临时对象表现为常量,是不能修改的,也就不能用非常量引用,只能用作const引用
[/Quote]
up
majun01 2008-12-28
  • 打赏
  • 举报
回复
A reference that is not to 'const' cannot be bound to a non-lvalue
xiaoyisnail 2008-12-28
  • 打赏
  • 举报
回复
临时对象表现为常量,是不能修改的,也就不能用非常量引用,只能用作const引用
就呆在云上 2008-12-28
  • 打赏
  • 举报
回复

a++是临时对象,不能引用的,除非你使用const引用,这样会发生一个中间的转化过程我就不说了
或者你这样:
#include <iostream>
using namespace std;

template <class T>
T cal(T &a, T &b, T &c)
{
return a + b + c;
}

int main()
{
int a = 5, b = 4, c = 3, i =5;

while(i--)
{
cout << cal(++a, ++b, ++c) << endl;
}

return 0;
}
Scofield_zao 2008-12-28
  • 打赏
  • 举报
回复
在C语言中使用#define 来定义常量,但这种方法不安全,有时候会出现意想不到的错误,所以C++ 中采用了const修饰符来代替#define定义常量
const 修饰符可以定义常量也可以定义常指针,现从定义一般常量开始介绍const修饰符的用法.
一般常量的定义格式如下:
const 数据类型一般常量名称=初值;
例如:
const int max=12;//定义常量 max,其初值为12

常量的定义一定要赋初值,且初值一旦确定就不可以在改变,如下面的赋值语句是错误的:max=19;//max是常量,值只能是12,不能被改变!

提示[size=24px][/size]:修饰符const 可以放在数据类型的左边也可以放在数据类型的右边,意义是完全不同的,如上面的例子也可以写作 int const max= 12;
当常量定义中的数据类型为int 的时候,数据类型也可以省略,如上面的例子也可以写作:const max =12;
const 修饰符也可以用来定义一个常量数组,例如:
const int max[3]={0,4,8};//定义常量数组max,有三个元素
同样的,常量数组也要赋初值,且初值不可改变!
一般常量的定义比较简单,但const 修饰符和指针结合后情况就比较复杂,分三种情况来讨论.
1.指向常量的指针
当const 修饰符出现在指针符号的左边时,表示指针是一个变量,但他所指向的是一个常量,例如:
const char *pstr="string1";
上面的例子定义的指针pstr是可以改变的,但pstr所指的内容是不能改变的。例如:
pstr="string2";//正确,指针pstr是变量,可以被改变,pstr不在指向字符串“string1”,
//而是指向字符串“string2”,但字符串“string1”的内 容并没变
pstr[2]='y';//错误,不能改变字符串的“string1”的内容,字符串“string1”是常量





有点累了,看看这对你有没有用,若有的话,下次再把后面的两条发给你啊
再见!

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧