const与指针、成员函数、#define
2017-07-03 21:14
489 查看
const与指针
我们知道被const修饰的变量表示常量,如const int a = 100; 表示a是一个值为100的常量,且不可改变。那么const修饰指针呢?注意:
const为常量赋值时,必须初始化
const修饰指针的情况分为4种:
int b = 500; const int* a = &b; // (1) int const *a = &b; // (2) int* const a = &b; // (3) const int* const a = &b; // (4)
如果 const 在 * 左侧,表示 const 修饰的是指针指向的变量
如果 const 在 * 右侧,表示 const 修饰的是指针
左变量,右指针
因此(1),(2)相同,都表示指针指向的变量是常量,钥匙可以变,但是通过该钥匙打开的仓库内的东西不能变(注意,通过其他钥匙是可以改变仓库内容的)。因此通过该指针指向的变量是不能改变的,即(*a)的内容不能变:
int b = 500; const int* a = &b; *a = 600; // 错误 b = 600; // 通过b改变而非*a改变,正确,此时*a也是600 a = &c; // 正确,可以让a指向另一个地址
情况(3) int* const a = &b; 表示指针本身是常量,但指针的内容可以改变。就是说钥匙不能变(只能指向该仓库),但是仓库内的东西可以变(a++错误,*a = 600正确)。对于情况3,定时的同时必须初始化。
int* const a; // 错误,定义时没有初始化 int* const a = &b; //正确 *a = 600; // 正确,可以修改内容 a++; // 错误
情况(4) const int* const a = &b; 表示指针指向的内容和指针都是常量,即钥匙和仓库内容都不能变。
const与成员函数
有一些成员函数,不改变类的数据成员,也就是说不改变别人,那么可以把这样的成员函数定义为const。如:void Student::print() { cout<<"this is student print method"<<endl; }
为了使成员函数的意义更加清楚,可以在不改变他人的函数上,加上const修饰。
class Student { ... void print() const; ... }; // 在类外,也必须也定义成const void Student::print() const { cout<<"this is student print method"<<endl; }
如果 被const修饰的函数,试图改变他人,则编译报错,你都是const修饰的函数了,还想改变别的数据成员,休想!!
const与#define
const与#define都能定义常量,但是const更好。首先,const可以定义类型,比如我们可以写 const int a = 100; 但是#define就不能。
其次,编译器可以对const进行安全检查,而对#define只进行简单替换,没有类型的安全检查,可能存在隐藏的错误。
因此,推荐使用const。
相关文章推荐
- 条款 30: 避免这样的成员函数:其返回值是指向成员的非 const 指针或引用, 但成员的访问级比这个函数要低
- 返回值为引用或指针的成员函数加const要注意
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 【C++】const、volatile不能修饰没有this指针的成员函数
- C++笔记(一)const与define,指针,引用,函数,类成员
- 【C++总结】函数形参,返回const对象与非const对象,成员函数,函数指针
- 指针数组,指针指向const成员函数
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- C++点滴——const/volatile不能用来修饰没有this指针的成员函数
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- Item 16. 指向成员函数的指针
- 大胆使用指向成员函数的指针
- 成员函数指针与高性能的C++委托(中篇)
- C++成员函数指针的应用
- 线程的封装技巧:把任意类的成员函数指针作为参数
- 成员函数指针【转贴】
- 成员函数指针与高性能的C++委托
- 成员函数指针与高性能的C++委托(下篇)