why_coder
2017-11-25 06:00
采纳率: 50%
浏览 1.5k

C++为什么形参会忽略顶层const 保留底层const

为什么c++函数重载时会忽略顶层const而保留底层const呢
这样设计有什么意义吗,能否给出实例来解释这样有什么好处

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • blownewbee 2017-11-25 15:38
    已采纳
     顶层const就是这个指针是常量,不能指向别的对象。但是可以改变指针指向的变量的值。
    底层const表示这个指针指向的变量是常量,指针可以指向别的对象,但是在指针指向这个变量的时候,不能改变变量值。
    
    形参如果是“顶层const”,那么也就是它不能指向别的对象。然而它指向不指向别的对象,都不会作用在调用者那里。
    好比
    int a=1;
    foo(a);
    void foo(int a) { a = 2; } //改变a,不会作用到调用者那个a
    
    因此事实上忽略不忽略都是忽略了,既然如此,忽略了还能简化代码,提高性能,所以就忽略了。
    
    点赞 打赏 评论
  • 公子¥小白 2019-08-04 14:39

    上面的回答不对把。顶层const只是不能改变指针的指向,可以改变指向对象的内容。
    这个例子也不恰当把,按这个意思,void foo(ini a)这种函数定义也没有意义。
    求真正理解的大神重新解答下这个问题。

    点赞 打赏 评论
  • yrnd 2020-03-10 00:11

    因为形参有没有顶层const,都不会影响实参的值。 示例如下:

    void f(const int a) { } // 值传递
    void f(int *const p) { *p = 1; }  // const修饰指针
    //void f(int &ref) { ref = 1; }  // 引用自带const
    
    int main() {
        int var = 0;
        f(var);
        f(&var);
    }
    

    对于底层const,修饰指针或引用所指向或绑定的对象。
    当实参有const修饰,形参non-const,则c++将禁止non-const到const的隱式类型转换。
    因此形参的底层const无法忽略,而顶层const可以被忽略。

    点赞 打赏 评论
  • lotus_chuan 2020-09-19 09:17

    谁说会忽略的

            const int a = 0;
        int e = 0;
        auto *b = &a;
        const int *c = &a;
        int *d = &e;
        std::cout << typeid(b).name() << " " << typeid(c).name() << " " << typeid(d).name() << std::endl;
    

    使用auto的时候就不会忽略,如果忽略的话就相当于获得了存了非底层const地址的底层const指针

    点赞 打赏 评论

相关推荐 更多相似问题