代码之家  ›  专栏  ›  技术社区  ›  Pop Catalin

const正确性如何帮助编写更好的程序?

  •  2
  • Pop Catalin  · 技术社区  · 17 年前

    这个问题来自一个问C++的人。(我懂一点C,但只懂一些C++的常识)。

    分配到C语言的C++开发人员说,他们忽略了const的正确性,这对我来说似乎很奇怪。在.Net中,为了禁止更改内容,您需要创建不可变对象或具有只读属性/字段的对象,或者传递对象的副本(默认情况下复制结构)。

    是C++的const正确性,一种创建不可变/只读对象的机制,还是有更多的机制呢?如果目的是创建不可变/只读对象,那么在.Net这样的环境中也可以这样做。

    9 回复  |  直到 17 年前
        1
  •  13
  •   dirkgently    17 年前

    整整一节专门讨论这个问题 Const Correctness

        2
  •  7
  •   anon anon    17 年前

    C++中的const正确性纯粹是一种确切地表达你意思的方式:

    void foo( const sometype & t ) {
       ...
    }
    

    表示“我不会更改t引用的对象,如果我尝试更改,请编译器先生警告我”。

    它不是一种安全特性,也不是(可靠地)创建只读对象的方法,因为使用C风格的强制转换进行颠覆很简单。

        3
  •  6
  •   akauppi    17 年前

    我打赌这是一个心态问题。我在和长期C++用户一起工作,并且注意到他们似乎在C++中思考(当然他们会这么做!)他们需要一段时间才能开始看到他们熟悉的答案的多个答案,从而得到像const correction这样的“股票”答案。给他们时间,试着温和地教育他们。

    话虽如此,我确实喜欢C++的“const”保证方式。它主要是向用户承诺一个界面,对象、指针后面的数据或任何东西都不会被弄乱。我认为这是常数正确性的#1值#2值是编译器在优化方面可以允许的值。

    当然,问题是,如果整个软件堆栈没有从一开始就考虑const。

    我相信C#也有自己的一套范例。这说明了为什么“每年学习一门新的(计算或自然)语言”如此重要。只是为了锻炼一个人的思维,用其他的方式来看待世界,并解决它的问题。

        4
  •  4
  •   Alex B    17 年前

    使用常量正确性,可以将可变对象公开为只读对象 浪费宝贵的记忆(尤其是与收藏有关的)。我知道,有这个 CPU和内存都很便宜 桌面开发人员的理念,但在嵌入式世界仍然很重要。

    此外,如果在C++中增加内存所有权的复杂性,那么最好不要复制包含或引用其他对象的非平凡对象,因此存在一种将现有对象暴露为只读的方法。

        5
  •  3
  •   javier-sanz    17 年前

    Effective C++ 为此问题专门制定了一个项目:

    第3项:尽可能使用常量。

    它真的启发了你:-)

        6
  •  3
  •   David Rodríguez - dribeas    17 年前

    真正的答案是,即使你没有使用过它,也很难理解,那就是你失去了表达能力。这种语言有一些用C#无法表达的概念,它们有意义,它们是设计的一部分,但在翻译成代码时丢失了。

    这不是一个答案,而是一个例子:

    现在,在C#/Java中,您可以采用两种方法之一:要么为调用者创建一个副本以供使用(保证数据不会更改,但效率低下),要么返回对内部保存对象的引用(只是希望调用者不会通过setter更改数据)。

    如果用户获取引用并通过它更改用作索引的字段,那么容器不变量将被破坏。

    前面没有提到的第三个选项是使对象不可变,但它在任何地方都禁用更改。不允许对对象进行完全受控的更改,更改的唯一可能性是在执行更改的情况下创建新元素。这相当于时间和空间。

        7
  •  2
  •   Cătălin Pitiș    17 年前

    C++提供了很多方法来弄乱代码。我将const correction视为第一种有效的方法,将约束放入代码中,以控制“副作用”(不必要的更改)。

    将参数标记为const(通常引用const对象或指向const对象的指针)将确保传递的对象不能更改,因此该函数/方法不会产生“副作用”。

    将一个方法标记为const将保证该方法不会改变它所处理的对象的状态。如果是,编译器将生成一个错误。

    标记const数据成员将确保数据成员只能在构造函数的初始化列表中初始化,并且不能更改。

    此外,智能编译器可以使用常量作为各种性能优化的提示。

        8
  •  1
  •   Gorpik    17 年前

    只要在编写代码时寻求编译器的帮助就足以让我提倡const正确性。但今天还有一个额外的优势:当您知道对象在哪里可以更改,在哪里不能更改时,多线程代码通常更容易编写。

        9
  •  1
  •   Dimitri C.    17 年前

    很遗憾,C不支持C++的const正确性。我传递给函数的所有参数中有95%是常量,const特性保证通过引用传递的数据在调用后不会被修改。“const”关键字提供编译器检查的文档,这对大型程序有很大帮助。

    推荐文章