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


  1. main.cpp
extern const int x = 10;//必须加extern
int 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;//底层const
const int *const p3 = p2;//左边是个底层const,右边是顶层const
const 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值