使用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属性