【问题标题】:Difference between const declarations in C++C++ 中 const 声明的区别
【发布时间】:2010-10-03 23:25:53
【问题描述】:

有什么区别

void func(const Class *myClass)

void func(Class *const myClass)

另见:

可能还有其他人......

【问题讨论】:

    标签: c++ syntax pointers constants parameters


    【解决方案1】:

    区别在于

    void func(const Class *myClass)
    

    你指向一个你不能改变的类,因为它是常量。 但是您可以修改 myClass 指针(让它指向另一个类;这对调用者没有任何副作用,因为它的指针被复制,它只会更改您的本地指针副本) 相比之下

    void func(Class *const myClass)
    

    现在 myClass 指向一个可以修改而不能更改参数的类。

    【讨论】:

      【解决方案2】:

      在第一个中,您声明了一个函数,该函数接受指向常量 Class 对象的指针。您不能修改函数内的对象。 在第二个中,您要声明一个函数,该函数接受一个指向非常量 Class 对象的常量指针。可以通过指针修改对象,但不能修改指针值本身。

      我始终牢记这条简单的规则:const 总是适用于它最左边的东西,如果这个东西不存在,它适用于最右边的东西。强>

      还可以查看我一周前提出的this question,它指出了一些非常有用的链接来理解 const 的正确性。

      【讨论】:

      • +1 以获得好的答案和如何记住 const-ness 的提示,这也是我使用的。
      【解决方案3】:

      经验法则是从右到左阅读声明:

      void func(const Class *myClass) 是一个指向 const 类的指针(或者严格来说“指向一个 const 类的指针”)

      void func(Class *const myClass) 是一个指向类的常量指针

      【讨论】:

      • 对于右->左的非常松散的定义。严格来说,第一个对我来说更像是“指向类 const 的指针”
      • 这条规则一看到这个就失效了:MyClass const *ptr
      • drhorrible: "一个 const 的类" 如果你想学究气的话。 ;) 弗雷德里克:为什么?指向 const MyClass 的指针?看起来很简单。
      【解决方案4】:

      诀窍是倒着读这些东西:

      void func(const Class *myClass)

      读取“myClass 是一个指向 const 类的指针”,这意味着我无法在 Class 中进行更改

      void func(Class *const myClass)

      读取“myClass 是一个指向类的 const 指针”,这意味着我无法更改指针。

      【讨论】:

        【解决方案5】:
        void func(const Class *myClass) { //...
        

        正如在其他答案中提到的,这个定义意味着参数myClass 指向Class 的一个实例,该实例不能被函数修改(mutableconst_cast 除外)。然而,函数体中的myClass 变量可以更改为指向Class 的不同实例。这是函数的实现细节。

        void func(Class *const myClass) { // ...
        

        另一方面,这个定义意味着 myClass 参数是指向 Class 实例的指针,它不是 const,因此函数可以使用它来完全操作类实例,但 myClass指针变量本身不能更改为指向函数体中的任何其他内容。

        其他答案未提出的重要一点是,对于函数签名,在考虑函数的类型时,任何顶级 const 或 volatile 限定都将被忽略。这是因为参数总是按值传递,所以是否为 const 只影响参数本身在函数体中是否可以改变,而不能影响调用者。

        因此这两个函数声明是等价的。

        void func(Class *const myClass);
        
        void func(Class *myClass);
        

        【讨论】:

          【解决方案6】:

          在 C++ 中

          const MyClass *ptr 
          

          还有这个

          MyClass const *ptr
          

          都表示ptr 是一个变量 指针,它指向MyClass 类型的常量 对象。也就是说,您不能通过ptr 更改所述对象。但是,您可以让ptr 本身指向MyClass 的其他对象。

          相比之下,这个

          MyClass *const ptr
          

          暗示ptr 是一个常量 指针,指向一个变量 MyClass 对象。在这里,您确实可以更改 ptr 指向的对象,但不能使 ptr 指向其他对象。

          注意,在上述三种语法中,第二种有点奇怪,但它是有效的语法。它不遵循这里其他人建议的从左到右阅读规则。但是,这就是你的 C++ 生活。

          【讨论】:

            猜你喜欢
            • 2011-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-10
            • 2020-06-07
            • 2019-08-09
            相关资源
            最近更新 更多