参见英文答案 >
Functions with const arguments and Overloading3个
我很困惑为什么下面的代码没有产生任何错误,因为传递给display的参数是相同的类型,即char.Does const真的有区别吗?
我很困惑为什么下面的代码没有产生任何错误,因为传递给display的参数是相同的类型,即char.Does const真的有区别吗?
#include<iostream> using namespace std; void display(char *p) { cout<<p; } void display(const char *p) { cout<<p; } int main() { display("Hello"); display("World"); }
编辑
根据答案,永远不会调用第一个显示,这是正确的,输出也是如此.
但是假设我这样做:
int main() { char *p="Hello"; display(p);//now first display is called. display("World"); }
编译器给出一个警告:不推荐使用从字符串常量到’char *'[-Wwrite-strings]的转换,但是它先调用display.Does是否意味着字符串现在不再被视为常量?
@R_301_323@
const char *和char *实际上并不相同.后者允许修改指向的char,而第一个将阻止它.
另请注意,如果这些是类方法,则void display()和void display()const也将是有效的重载.后者意味着该方法不得改变对象的状态.
考虑以下代码:
void display(char *s) { std::cout << "Display" << std::endl; } void display(const char *s) { std::cout << "Display with const" << std::endl; } int main() { char *str = strdup("boap"); const char *str2 = "toto"; /* It is a string literral "bound" as a char *. Compiler will issue warning,but it still compiles. Avoid to do that,it's just an exemple */ char *not_safe = "not_safe"; display("llama"); display(str2); display(str); display(not_safe); }
这将使用const打印显示两次,然后两次显示.见there.
现在,让我们看看为什么:
>“llama”是一个字符串文字,然后被解析为const char *.> str2是指向字符串文字的指针.由于它的类型是const char *,因此它也转向const重载.> not_safe也是指向字符串文字的指针.但是,它的类型是char *:这是不正确的.它指向的内存是只读的,尝试修改它会导致崩溃.但是,变量的类型仍然是char *,因此这解析为非const重载.> str是一个char *指针,它指向的字符串不是只读的.修改其内容是有效的,因为它的类型是char *,它将解析为非const重载.