C++中为什么临时对象的引用一定要加const;就像: const string& s = string("abc"); 求详解

有没有人在啊,想请说下,C++中为什么临时对象的引用一定要加const;就像: const string& s = string("abc"); 求详解
最新回答
槐序廿柒

2024-10-22 17:04:12

如 iamchenmin 所说,有防止修改的功能。另,

1、考虑如下函数定义:
int fun2(int& pi)
{
return pi;
}
因为没有修改pi,所以参数就懒得加const限制,但在其他地方调用次函数时会有限制:非const的引用参数必须用与其类型一致的对象/量来初始化,
也就是说可以这样用:int a=5;b=fun2(a);
这样:int b=fun2(5);是错的。
因为数字5是一个字面值,也就是个右值,而函数要求的是一个具体的int类型的对象/变量,需要左值。
然后这样:long a=5;int b=fun2(a);也不行,类型不一样。
但参数加上const后上两种都是合法的,const引用的参数允许可行的转换,比如fun2(3.14),参数是个浮点,但
编译器
会转换成int然后调用,要是压根转换不过去那肯定加了const也不行的。

2、另外,即使说,我所有代码为了易读,绝对不会出现字面值这东西,还有个问题。如果你写了个函数为了保护参数加了const,但函数里面调用了另一个参数没const的函数,那么这里估计就要出错,const实参不能传递给非const形参。虽然你能保证自己的代码不冲突,但不能保证别人的代码,尤其是合作的时候每人写一个部分。

3、综上,不需要改动的参数,如果要通过引用传递,全都加上const最安全。

ps:你所说的“强制要求添加的”,实际上并不是强制,因为加不加是作者自己的意思,而编译错误都是出在调用的语句,也就是使用者错了 o(∩_∩)o...
青苓菀

2024-10-22 10:16:18

C++中是强制的,对于类型定义方面,会将带有const修饰的看做一个类型,而将不带const修饰的看做另一个类型,当你在传递参数的时候,若形式参数为int&,而实参是const int&,那么编译器将报错,错误信息是const int&的类型无法对int&的类型做初始化,简单的说就是你无法使用一个右值对左值初始化,因为在函数传参时,实际是使用实参对函数形参做初始化,所以会报错。

楼主的例子应该是定义一个string类的常引用来接收string函数的返回值,那么可以查看string函数的返回值是否是被const修饰的, 如果修饰过,那么返回值是一个右值,所以必须使用常引用来接收。
素颜

2024-10-22 13:06:55

防止被修改。

 

不管是临时对象还是函数调用,只要不涉及对对象的修改,一般都推荐加上const。

 

比如,C语言里的string.h对strcpy的声明就是这样的,

char *strcpy(char *ori,const char *src)

在后面的src加上了const,视其为常量,使它只能被读取而不能被修改。

 

总结就一句话,防止有意的或者无意的修改。

追问
如果仅仅是防止无意的修改,那么应该是编写程序的人有选择的添加const吧,但这个是强制要求添加的,不加const编译都会失败;