zoukankan      html  css  js  c++  java
  • const修饰符与函数

    一、用const修饰函数的参数##

    函数参数类型前加const指明该参数为常量,在函数内部不可改变。

    void func(const int x) {
        //x不可以在内部进行赋值等操作.
    }
    

    注:当参数为引用传递或者指针传递作为输出时,都不能加const

    二、用const修饰函数的返回值##

    函数返回时,会把返回值复制到外部临时的存储单元中,存储类型由函数的返回类型来确定。

    • “值传递”加const修饰没有任何价值。
    • ”址传递”加const修饰,函数返回值只能被赋给加const修饰的同类型指针,或者利用const_case转化为去const的常量。
    const int* func(void) //函数声明
    ...
    int* a = func();             //报错
    int* c = const_cast<int*>(func()); //正确
    const int* b = func()    //正确
    
    • "引用返回",引用即为const指针,函数返回引用并加const限定后,函数返回的是地址与地址所存的值都被const修饰的指针,存于临时的外部存储单元中,
    const int& func();  //函数声明
    ...
        int b = func();                                    //正确,从外部存储单元中赋值给变量
        int& c = func();                                  //错误,试图在同一个地址中即存储变量又存储常量
        int& d = const_cast<int&>(func());    //正确,去const
        const int& e = func();                        //正确
    

    如果上面错误的例子看不懂可以看之前的const修饰符限定的常量指针const与non-const赋值部分。
    引用返回总结
    引用返回一般很少用,但既然选择引用返回,返回的肯定是一个作用域高于函数作用域的变量的引用,毕竟函数作用域下的变量在函数结束后会释放掉(static这里不考虑)引用即为该变量的const指针,既然选择返回指针,就想通过直接利用指针修改该地址下的变量,所以就更没有必要返回const引用,毕竟const引用的返回值不希望对地址所存的值进行修改。引用返回更常用的方式是:

    int& func();
    ...
        int& a = func();
    

    这一可以通过a来改变返回值。

    三、const 成员函数##

    任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。

    class test
    {
    public:
        void func(){}
        int getNum(void) const // const 成员函数
        {
            ++num;     // 编译错误,企图修改数据成员m_num
            func();     // 编译错误,企图调用非const函数
            return num;
        }
    private:
        int num;
    };
    
  • 相关阅读:
    每周学算法/读英文/知识点心得分享 1.28
    ARTS 1.21
    ARTS 1.14
    ARTS 1.7
    ARTS 12.31
    ARTS 12.24
    Leetcode : Median of Two Sorted Arrays
    我是怎样改善遗留系统的
    《大话重构》免费送书活动开始啦
    我的新书终于要出来啦
  • 原文地址:https://www.cnblogs.com/narjaja/p/9300525.html
Copyright © 2011-2022 走看看