指针
指针:有两个用法,有两个值。
一个是指向的值,一个是自身的值、
eg:
int a = 10, b = 20;
int *p = &a;//1
const int *p = &a;//2
int* const p = &a;//3
const int* const p = &a;//4
上述代码执行下面语句时,编译是否能通过呢?
*p = 100;
p = &b;
第一行:都可以
第二行:不可以
由于const修饰的是指针指向的值,所以*p = 100;不可以编译通过;
但是p = &b;可以编译通过;
第三行:不可以
const修饰的是自身的值,所以*p = 100;可以编译通过;
p = &b;不可以编译通过;
第四行:不可以
既有const修饰指针自身,又有const修饰指针指向的值;
const int a = 10;
const int *p = &a;//第一行 //编译通过
int* const s = &a;//第二行 //编译不通过
由于a是常性,不允许修改;第一行的const修饰的是p指针的指向,所以是不能改变所指向的值,因此没有修改常量a的风险;但是第二行,const修饰的是指针自身,所以有修改常量a的风险。
在类中:普通对象可以调动普通方法,也可以调动常方法;(优先调用普通方法)。
但是常对象只能调用常方法。
int & Value()
{
return value;
}
const int & Value()
{
return this->value;
}
int main()
{
Object obj(100);
const Object obj2(100);
}
如果类里面的成员函数不去改变对象的状态,我们就要把成员方法尽可能的设计成常方法。(因为有可能是普通对象,也可能是一个常对象,使我们这个方法的通用性更强)