const与指针、成员函数、#define

来源:互联网 发布:类似于柏拉图软件 编辑:程序博客网 时间:2024/06/03 19:51

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也是600a = &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;    ...};// 在类外,也必须也定义成constvoid 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。