读书人

为啥函数参数为非const引用不会发生类

发布时间: 2013-09-27 14:23:43 作者: rapoo

为什么函数参数为非const引用不会发生类型转换

void uppercasify(string& str) //把str中所有的字符改成大写
{
for (string::size_type index = 0; index != str.size();
++index)
cout<<toupper(str[index]);
}
int main()
{
char subtleBookPlug[] = "Effective C++";

uppercasify(subtleBookPlug);

return 0;
}

想不明白,
[解决办法]
如果输入的是const引用,const代表的是“不会被修改”,不会被修改也就等于没有输出,因此输入字符数组可以转换为一个临时的字符串再提供const引用,因为“转换得到的这个临时变量在函数退出时直接销毁就行,不会有任何问题”
但如果输入的不是const引用,那就代表“会被修改”,也就等于有输出,那么字符数组是可以转换为字符串,但这个临时字符串在函数结束后该怎么办?你说它没有意义可以销毁,你怎么告诉编译器?编译器不知道,它就报错,说这里不合理不应该你写错了。
[解决办法]
引用:
void uppercasify(string& str) //把str中所有的字符改成大写
{
for (string::size_type index = 0; index != str.size();
++index)
cout<<toupper(str[index]);
}
int main()
{
char subtleBookPlug[] = "Effective C++";

uppercasify(subtleBookPlug);

return 0;
}

想不明白,


因为在你的例子中,从char*到string的隐式转换的结果是右值,而左值引用是不能引用右值的,于是在C++03中,就需要使用const的引用了。
[解决办法]
引用:
“临时字符串在函数结束后该怎么办”?这是什么意思,临时变量不会在函数调用后销毁吗

被修改的临时变量不被保存到一个确定的变量中,修改就毫无价值,编译器是这么认为的
这种情况下就应该使用const,告诉编译器“这个临时变量不可修改因此可以随便销毁”

当然这都是简单的理解方式,标准规定看4楼

读书人网 >C++

热点推荐