c – const函数重载

前端之家收集整理的这篇文章主要介绍了c – const函数重载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Functions with const arguments and Overloading3个
我很困惑为什么下面的代码没有产生任何错误,因为传递给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是否意味着字符串现在不再被视为常量?

解决方法

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重载.

原文链接:https://www.f2er.com/c/115837.html

猜你在找的C&C++相关文章