const用法总结

与const有关的用法以及由const引申出的相关内容包括:
1、用const代替#define
2、声明为static const类型的类中的数据成员何时为其赋初值
3、const修饰指针*ptr
4、const修饰STL中容器迭代器
5、const修饰函数参数、返回值
6、mutable
7、类型强制转换:const_cast、static_cast、dynamic_cast、reinterpret_cast
下面分别针对以上const以及const引出的相关知识点进行叙述:
1、用const代替#define
#define num 1.3
const double num=1.3;
因为预处理期编译器会将代码中的所有宏定义num替换为1.3,当程序报错也只会提示1.3错误,如果这条宏定义包含在其他头文件,若代码工程庞大甚至不是自己写的这个宏定义,那么排查起来就会很恼火,而改为const常量定义则不会存在这种问题
2、声明为static const类型的类中的数据成员何时为其初始化
有时候,我们在类里面声明static const数据成员,对于这类数据成员,如果其类型是bool、char、int、long则可以在类声明中初始化,其他类型的static const数据成员必须在类外的定义式中初始化,另外,static数据成员最好也在类外初始化
3、const修饰指针*ptr
采用就近原则
const int* ptr; //ptr所指内容不可改变,ptr可以指向其他地址
int const* ptr; //ptr所指内容不可改变,ptr可以指向其他地址
int* const ptr; //ptr所指内容可改变,ptr不可以指向其他地址
const int* const ptr; //ptr所指内容不可改变,ptr不可以指向其他地址
4、const修饰STL中容器迭代器
vector<int>::iterator iter; // iter所指内容可以改变,iter可以指向其他地址
vector<int>::const_iterator iter; // iter所指内容不可以改变,iter可以指向其他地址
const vector<int>::iterator iter; // iter所指内容可以改变,iter不可以指向其他地址
5、const修饰函数参数、返回值
1)修饰函数返回值
class Rational{...};
const Rational operator*(const Ration& lhs, const Ration& rhs);
Rational a, b, c;
(a*b)=c; //报错,此时报错是应该的,因为我们不能对一个乘法操作的结果复制不是吗
为什么会报错呢,因为operator*函数的返回值是一个const,不能对const再次复制
2)修饰函数参数
对于以下代码:
class test{
public:
...
const char& func(int pos) const{ //这里的const修饰this指针,相当于const *this,而且这里的const实现了和下一个函数的重载
count++; //此处会报错,因为不能修改其数据成员
return str[pos];
}
char& func(int pos){
count++; //不回报错
return str[pos];
}
private:
string str;
int count;
};
6、mutable
mutable:可变的,可以释放掉非static成员变量的const约束
参考上诉代码,由于第一个func函数中有const修饰this指针,所以不能修改其数据成员count,如果我们一定要修改该数据成员,可以将int count用mutable修饰,该为:
mutable int count;
7、类型强制转换:const_cast、static_cast、dynamic_cast、reinterpret_cast
我们可以在非const的func函数中调用const的func函数,进而避免代码的重复,提升效率(但是反过来用非const实现const的func函数则不安全,这也是为什么const成员函数调用非const成员函数是错误的)
char& func(int pos){
return const_cast<char&>(
static_cast<const test&>(*this)->func(pos)
);
}
其中:
const_cast:移除const限制
static_cast:
dynamic_cast:

reinterpret_cast:

关于这几个类型强制转换的介绍参考另一篇文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值