1.const变量仍然是一个变量,意味着编译器在编译的过程中要在内存中为该变量分配一个地址,而常数则是意味着只是记载在内存表里的一个数或者字符串.
2.const变量必须在定义时进行初始化,除非是一个extern全局变量.
3.假设有一个变量extern const int bufsize;则buffsize变量在作用域内是不能被修改的,而真实的buffsize(即在其他出定义的buffsize)就不一定是const类型,而且extern const 类型的变量也是不能作为数组大小进行数组定义,因为编译器无法知道该值的大小.
4.const变量的值如果是在编译时就确定了,它可以作为数组的长度进行数组定义,而如果是在运行的时候才能确定的const值就没有这个作用.
如
const int size = 12; int arr[size]; //ok int x; cin>>x; const int size = x; int arr[size]; //error,因为size不是在编译时确定的值
5.const int * p; p是一个指向const int类型变量的指针变量,意思是p指向的对象不能通过p进行修改,p指向的对象可以通过其他的方式进行修改
int * const p; p是一个const指针,指针指向int类型变量,p本身不能改变,即不能++,--,也不能被其他指针赋值,但能够通过p指针改变p所指对象的值.
char *s = "hello world";//"hello world"是常量,存储在代码段中,而代码段是不可写的,执行时s指向该块内存区域,s类似于const char *s;因此s指向的区域的值不能被改变 cout << s << endl; s[0] = 'B'; //error cout << s << endl;
char src[] = "hello world"; //先在堆栈里分配一段内存,将代码段里的"hello world"拷贝到堆栈里的这块内存里,因此src里面的内容可变
src[0] = 'B'; //right
int data::getdate() const; //const 成员函数,该函数不能改变对象中的成员变量,const关键字必须在声明和定义处同时出现.
const data temp;// temp是const对象.
class A{
int i;
public:
void f() {cout << "f()" << endl;} //两个f()构成函数重载,此处相当于是void f(A *this),下面这个函数是相当于void f(const A *this);const对象只能调用const函数.
void f() const {cout << "f() const " << endl;}
};
A a;
a.f();//输出"f()";
const A b;
b.f();//输出"f() const"
6.类中的const成员变量必须在初始化列表中进行初始化,不能在构造函数的函数体中初始化.
若有个成员变量是const,不能用该const成员变量作为数组的size.
7.引用作为局部变量和全局变量的时候必须在定义处进行初始化,而在参数列表和成员变量的引用在构造函数和调用函数处进行初始化.
没有引用的引用,也没有指向引用的指针(int& *p //error),但有指针的引用(int* &p),离变量最近的运算符决定了变量名的类型,如 int * &p;p是一个引用,引用的变量类型的指针,也即p是指针变量的引用.