当您刚读取数据时,为什么要使用常量指针指向常量值? P>是否有任何合理的理由来说明为什么在C++中使用常数指针?我根本不明白它背后的原因,因为在某人给我的src目录中,他们甚至没有尝试写入var,他们只是从中读取一个值

当您刚读取数据时,为什么要使用常量指针指向常量值? P>是否有任何合理的理由来说明为什么在C++中使用常数指针?我根本不明白它背后的原因,因为在某人给我的src目录中,他们甚至没有尝试写入var,他们只是从中读取一个值,c++,pointers,C++,Pointers,即使您只需要读取一次常量指针,也总是使用常量指针指向常量变量,这有点像惯例吗 bool serialize_state(int const fd, game_state const * const state) { ... } =>常量指针指向保存的“状态”中的常量游戏状态,对吗?指向常量值的指针保证客户端既不能更改值也不能更改指针(因此它指向不同的对象)。适用时,这种方法有几个优点: 更安全,更不容易出错,因为不可能(或至少很难)更改程序中不应该更改的部分 正如Joachim Isakss

即使您只需要读取一次常量指针,也总是使用常量指针指向常量变量,这有点像惯例吗

bool
serialize_state(int const fd, game_state const * const state) { ... }

=>常量指针指向保存的“状态”中的常量游戏状态,对吗?

指向
常量
值的
指针保证客户端既不能更改值也不能更改指针(因此它指向不同的对象)。适用时,这种方法有几个优点:

  • 更安全,更不容易出错,因为不可能(或至少很难)更改程序中不应该更改的部分
  • 正如Joachim Isaksson在他的评论中提到的那样,它可以安全地使用常量值调用某些函数(因为您可以保证函数不会试图修改它们)

  • 当用作函数参数时,可以向它们传递临时值
  • 它通过代码(而不是注释)明确了意图,因此可以在编译时捕获某些错误

我看不出有什么真正的缺点,所以我的建议是:当您确实需要指向同一
const
对象的原始指针时,请始终使用它们。尽管如此,我还是建议不要使用原始指针,因为
std::unique_ptr
std::shared_ptr
是标准的一部分

在几乎所有情况下,尽可能使变量保持常量是一件好事(tm),因为它表达了意图并减少了误用的机会

然而,在传递论点时,有一个警告

向常量资源传递指针或引用是合理和正确的:

void foo(const char* text);    
void foo(const std::string& text);
但当将实际副本作为参数传递时,将其设为常量有许多缺点。考虑:

std::string sorted(const std::string source)
{
    // I must copy source again because it's immutable
    auto result = source; // redundant copy
    std::sort(std::begin(result), std::end(result));
    return result;
}
而传递可变参数可以让函数更有效地使用它:

std::string sorted(std::string source)
{
    // lots of opportunity for copy elision and RVO here.
    std::sort(std::begin(source), std::end(source));
    return source;
}
为了解决这是否是一个好形式的具体问题:

void foo(const char* const text);
答案是有保留的“否”,因为:

  • 第二个常量不向任何人提供任何保证。被调用的函数可以简单地复制指针
    文本
    ,并修改副本

  • 它用另一个词把API弄得乱七八糟,却没有增加任何价值

  • 但有一个相反的论点认为,第二个常量不是为了调用方的利益,而是为了
    foo()
    的实现者

    在这种情况下,它为他提供了一个指向常量数据的安全常量指针,他可以在不意外更改的情况下使用该指针


    与此相反的论点是,所有这些都是通过接口泄漏实现细节。

    const
    让您一眼就能看出,在下面的代码中没有修改变量。因此,它有助于更快或根本不理解代码。因此,一般的建议是在所有可以使用的代码上慷慨地洒上const

    C++11移动语义与该建议冲突。例如,如果一个函数接受一个
    字符串
    参数,并且只是将值存储在某个地方,那么形式参数最好不要是
    常量
    ,这样它就可以有效地
    从中移动。在我看来,这里缺少了一个语言特性,也就是说,在这一点之后,变量不能也不会被使用,这样编译器就知道了,这样它就可以在代码范围内逻辑地
    const
    ,在代码范围内它确实携带了有用的值


    < > C++不完全支持通过<代码> const >和 CONTXPRP关键字提供的<>代码> const >。这太可惜了。但是,即使不能在所有需要的情况下轻松地使用
    const
    (因为它阻止了移动优化),优秀的程序员也会在不与其他问题冲突的任何地方使用它,因为几乎所有关于代码可能影响的约束,帮助理解和维护代码。

    他们甚至不尝试写入var,他们只是从中读取一个值。了解该事实的更简单方法是什么?是在签名中查找常量,还是通过分析整个方法(以及它将内容传递给的所有方法)进行写入?这也意味着你可以安全地用一个常量来调用它,因为它不能被写入。问题正好相反:如果你只是读取数据,为什么不使用只读类型呢?在编写时不能真正使用只读类型,是吗?关于第1点和第2点,据说至少有一个代码分析工具(我认为它是一个IDE)不理解顶级
    const
    不会影响签名,如果实现中有一个顶级的
    const
    ,而声明中没有,那么就会抱怨。此类工具问题可能是在声明中使用顶级
    const
    的一个很好的实际原因。此类工具问题可能是不使用该工具的一个很好的实际原因“更改不应该更改的程序部分”可能是一个打字错误。“当用作函数参数时,可以向它们传递临时值”,在这里,我想你们讨论的是一个引用类型为const T的形式参数,也就是说,不是指const pointer关于“我真的看不到任何真正的缺点”,对于
    const
    参数,通常主要的缺点是禁止
    move