const int num = 0; // 常量必须要初始化,而且不可修改。
====================================================
int num = 100;
const int *p = #
在这两句代码后,p可以修改,*p不可以修改。
int num = 100;
int *const p = #
在这两句代码后,*p可以修改,p不可以修改。
所以变量能不能修改看的是声明时const后面的是什么。
=====================================================
const int *p; //修饰的是*p,所以*p不可以修改,但是p可以改,所以p可以不用初始化。
int *const p; // 这句话会报错,const修饰的就是p,所以p需要初始化。
=====================================================
如果在类里面加入了const成员:
在声明const变量时不能直接初始化,必须在初始化列表中初始化。
引用变量如果要在类中使用,也需要在初始化列表中初始化。
class CPerson
{
public:
const int num; //const 成员变量
public:
CPerson():num(1223) //初始化列表
{
}
};
如果这个类中包含另一个类的对象,执行对应构造函数初始化,也要在初始化列表中初始化。
class AA
{
public:
AA(int a)
{
cout<<"AA"<<endl;
}
};
class CPerson
{
public:
AA aa;
public:
CPerson():aa(123)
{
}
};
=====================================================
初始化列表执行的顺序是根据变量定义的顺序执行的。
=====================================================
常函数
不能修改类的成员属性,函数里面默认的this指针,加入const后就不能修改了。
常量对象可以调用常函数。
常量对象不能调用普通函数,因为函数想要调用对象,传入指针,函数就可以修改指针所指向的内容,而常量对象是不可修改的,调用了就会冲突。
========================================================
常函数在什么时候使用?
如果在一个函数中,需要传入一个对象,主函数定义一个对象,调用函数时会拷贝整个对象,比较消耗时间,所以会在函数参数那里写为值引用。
为了不让函数修改对象里的东西,在值引用的前面加上const。
而参数有const属性后,它所能使用的类中函数,就得为常函数。