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

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值