const 限定符 extern 对常量的引用 指向常量的指针 常量指针

来源:互联网 发布:java栈实现 编辑:程序博客网 时间:2024/05/22 00:21

  1. main.cpp
extern const int x = 10;//必须加externint main(){return 0;}

fun.cpp

extern const int x;void fun(){cout<<x<<endl;//可以使用x;}

2.
对于非const变量而言
main.cpp

int x = 10;//必须是全局变量int main(){return 0;}

fun.cpp

extern int x;void fun(){cout<<x<<endl;//可以使用x;}

const的引用–对常量的引用

    //常引用    int a = 10;    const int aa = 11;//可以引用非常量值    //int &bb = aa;//错误,必须加const    const int &b = a;//不允许b修改a值,    b = 13;//报错,b是不可修改的值    cout << b << "  " << a << endl;//10 10    a = 12;    cout << b << "  " << a << endl;//12 12    const int &c = 1;//常量引用的初始值可以为右值    cout << c <<  endl;//1    //int &d = 1;//错误,非常量引用的初始值必须为左值

初始化常量引用时,允许用任意表达式或常数做初始值
一般而言,引用类型必须与其被引用对象的类型一致,这是个例外,即允许一个常量引用引用一个非常量的变量

double dval = 3.14;const int &val = dval;/*此处val引用了一个int型的数。但是dval是一个双精度的数,因此为了确保让val绑定一个整数,编译器把上述代码变成了如下形式*/******************************************************const int temp = dval;//由双精度浮点数生成一个临时的整型变量const int &val = temp;//把val绑定这个临时量*******************************************************//当引用不是常量时,int &val2 = dval;//测试中也不通过val2 = 10;//此时改变的不是dval值,而是dval生成的临时量值

指向常量的指针
一般而言,指针的类型必须与其所指对象的类型一致,这是个例外,即允许一个指向常量的指针指向一个非常量对象

double dval = 3.14;const double *pdval = &dval;//不能修改dval的值//上述等价于:const double dval = 3.14;const double *pdval = &dval;//指向常量的指针

常量指针–将指针本身定义为常量
常量指针必须初始化,一旦初始化,则该指针指向的地址值不能再改变。将* 放在const之前说明指针是一个常量(从又向左读)

int val = 10;int *const ptr = &val;//指针是个常量--常量指针,ptr左边是const,说明ptr是个常量,*代表这个常量是个指针const int *const ptr2 = &val;//ptr2是一个指向常量对象的常量指针  从右向左读

顶层const 底层const
顶层const:指针本身是个常量 int *const ptr;
底层const:指针指向的内容是个常量:const int *ptr;

int i = 0; int *const p = &i;//顶层const const int c = 42;//顶层const const int * p = &i;//底层constconst int *const p3 = p2;//左边是个底层const,右边是顶层constconst int &r = c;//用户声明引用的都是底层const

当执行拷贝操作时,顶层const没有影响,当拷贝底层const时,拷入和拷出的对象必须是具有相同的底层const资格(非常量可以转换为const)

int i;const int ii = i;//
    const int i = 1;    const int &p = i;//对常量的引用    //int & const pp = i;//错误,引用是个常量

const形参和实参
因为顶层const变量去初始化变量时,会忽略顶层const

const int i = 1;int c = i;//拷贝构造,忽略掉顶层const

可以用非常量初始化一个底层/顶层const对象,但是反过来
可以用顶层const对象初始化非常量对象(如上)
不可以用底层const对象初始化非常量对象

    int x1 = 1;    const int x2 = x;//非常量初始化顶层const    const int *x3 = &x;//非常量初始化底层const    int x4 = x2;//顶层const初始化非常量,忽略顶层const    //int *x5 = x3;// 错误,底层const初始化非常量    const int *x5 = x3;//必须与x3是同类型
0 0