美文网首页
Item-2:尽可能使用const

Item-2:尽可能使用const

作者: 彳亍cium | 来源:发表于2019-11-20 23:40 被阅读0次

    使用const关键字可以使得代码的安全性提高,告诉别人某些动作和某些变量不可以改变

    • 指针和const

      char greet[] = "hello";
      char * p = greet;            //指针和所指的东西都可以改变
      const char * p = greet;      //指针可以改变,但是所指的东西不可以改变
      char * const  p = greet;     //指针不可以改变,但是所指的东西可以改变
      const char * const  p = greet;  //指针和所指的东西都不可以改变
      

    关于const的位置和属性的关系

    const出现在星号的左边,表示所指的东西是常量,不可变;如果子啊右边说明指针不可变,是常量。

    • 迭代器和const

    迭代器和指针很像,他是泛化的指针。所以对于他也有两种情况就是迭代器本身const和所指的东西const

    std::vector<int> vec;
    const std::vector<int>::iterator iter = vec.begin();  //迭代器const
    
    std::vector<int>::const_iterator iter = vec.begin();//迭代器所指的东西const
    
    • 函数与const

    因为很多函数的传入参数都是以引用的方式传入,所以对于传入的参数在函数内部是可以对原始数据进行修改的,这是不被建议的做法,除非你就是想让函数完成修改的功能。那么其他的情况就需要你对传入的参数加上const限制。

    const Ration operator* (const Ration& lhs, const Ration &rls);
    

    上面的做法可以避免很多问题:1、无法修改传入的参数;2、返回值是常量无法作为左值。

    • const成员函数

    两个成员函数如果只是常量性不同依然可以被重载

    class Text{
    private:
        std::string text;
    public:
        const char & operateor[](std::size_t pos) const{       //for const实例对象
            return text[pos];
        }
        char & operateor[](std::size_t pos) {                  //for non-const实例对象
            return text[pos];
        }
    
    };
    Text tb("hello");
    std::cout<<tb[0];           //调用const char & operateor[] 
    
    const Text ctb("hello");
    std::cout<<ctb[0];          //调用char & operateor[]
    

    下面还有一个建议:当non-const版本成员函数和const版本成员函数有很大的重复代码时,另non-const版本调用const版本

        const char & operateor[](std::size_t pos) const{       //for const实例对象
            XXXXXXXX;
            YYYYYYYY;
            ZZZZZZZZ;
            return text[pos];
        }
        char & operateor[](std::size_t pos) {                  //for non-const实例对象
            XXXXXXXX;
            YYYYYYYY;
            ZZZZZZZZ;
            return text[pos];
        }
    //明显能发现有很多的代码重复,那么non-const版本可以改成:
    char & operateor[](std::size_t pos) {                  //for non-const实例对象
            return const_cast(static_cast<const Text&>(*this) [pos])
    } 
    
    // 实现的本质是1、将本身转化成const对象;2、转化成const之后调用[];3、将返回值戒除const属性
    

    相关文章

      网友评论

          本文标题:Item-2:尽可能使用const

          本文链接:https://www.haomeiwen.com/subject/jgzaictx.html