C++ 静态转换还是c样式转换

C++ 静态转换还是c样式转换,c++,memory,C++,Memory,我正在尝试实现memchr()函数。我的代码必须返回一个void*,因此如果我们找到了该字符,就可以对其进行更改。问题就在这里。我有两种方法,一种是c_风格 void *memChr(const void *s1, int c, size_type n) { const char *p = (const char *)s1; while (n--) if (*p++== (char)c) return (void *)--p; retu

我正在尝试实现memchr()函数。我的代码必须返回一个void*,因此如果我们找到了该字符,就可以对其进行更改。问题就在这里。我有两种方法,一种是c_风格

void *memChr(const void *s1, int c, size_type n)
{
    const char *p = (const char *)s1;

    while (n--)
    if (*p++== (char)c)
        return (void *)--p;

        return 0;
}
这些方法使用c风格的强制转换,这里我们将s1作为常量发送,这是正确的,因为我们不需要任何更改,然后我们将p作为指向void的非常量指针返回,这也是正确的。无论如何,这是旧的,我想要一个更C++的方法。像这样:

void *memChr( void *s1, int c, int n)
{
    char *p = static_cast< char *>(s1);

    while (n--)
    if (*p++ == static_cast<char>(c))
        return static_cast<void *>(p);

    return 0;
}
void*memChr(void*s1,int c,int n)
{
char*p=static_cast(s1);
而(n--)
如果(*p++==静态(c))
返回静态_-cast(p);
返回0;
}
这些代码的问题是:我不能将常量指针强制转换为非常量指针。静态\u强制转换比c样式强制转换更安全,但它使我使用了不合适的非常量参数。使用标准memchr()参数,无法使用静态_cast实现。
那么哪种方法更好呢?我刚完成C++教程,我正在努力学习好的编码,但是我有点困惑。p> 您可以使用常量转换从常量指针转换为非常量指针:

void *memChr( const char *s1, int c, int n)
{
    char *p = const_cast< char *>(s1);

    while (n--)
    if (*p++ == static_cast<char>(c))
        return static_cast<void *>(p);

    return 0;
}
void*memChr(常量字符*s1,int c,int n)
{
char*p=const_cast(s1);
而(n--)
如果(*p++==静态(c))
返回静态_-cast(p);
返回0;
}

如果
s1
最初指向常量数据怎么办?也就是说,无论使用哪种样式,只要希望返回非常量指针,就应该将
s1
声明为非常量指针。那么,您就不需要
常量了。为了清晰起见,我推荐C++风格的CAST。从输入中删除<代码> const 限定符是不好的做法。若要修改返回指针处的数据,请将非常量作为输入。或者最好返回常量指针并强制调用者显式删除
const
。我认为这个答案至少应该附带一个免责声明,即虽然这样做有效,但将常量指针作为函数参数,然后在该函数内丢弃常量是非常糟糕的做法。同意@void\ptr。取消成本
const
数据可能会导致严重的、不可预测的结果。如果函数要修改参数,则声明参数
const
是毫无意义的。这是在欺骗函数的调用者,告诉他们他们的数据不会被修改,然后在背后捅他们一刀。真不酷。