Item-2:尽可能使用const

使用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属性
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。