Item-2:尽可能使用const

2019-11-20  本文已影响0人  彳亍cium

使用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 Ration operator* (const Ration& lhs, const Ration &rls);

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

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

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属性
上一篇下一篇

猜你喜欢

热点阅读