const与const指针

本文详细介绍了C/C++中const关键字的用法,包括const作为不可变变量的作用、const指针及其赋值规则,以及类成员const的初始化方式。

一.C/C++中的const

     C中的const是"一个不能被改变的普通变量",在C中,它总是占内存的,而且它的名字是全局符,默认是外部连接.C编译器不能把const看成一个编译期的常量.在C中:

      const bufsize =100;

       char buf[bufsize];

 是错误的.

      C++中的const默认是内部连接,也就是说,const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到.当定义一个const时,必须赋一个初值给它,除非用extern作了清楚的说明:

 extern const bufsize;

    C++编译器通常不会为const分配存储空间,它把这个定义保存在符号表里。

二 const指针

 当使用带有指针的const时,有两种选择:或者const修饰指针正指向的对象,或者const修饰存储在指针本身的地址里.

 (1)指向const的指针

      const int * x;

     " x是一个指针,它指向一个const int",这里不需要初始化,因为说x可以指向任何东西,但是它所指的东西是不可以改变的.

 (2)const指针

    int  d=1; 

     int * const x=&d;

    "x是一个指针,这个指针是指向int 的const指针".因为现在指针本身是const指针,编译器要求给它一个初始化值,这个值在指针寿命期间不变.然而要改变它所指向的值是可以的,可以写 *x=2;

三 const指针赋值

 int d =1;

    const int e=2;

    int *u=&d;  // ok--- d not const

    int *v= &e; //illegal ---- e const

    int *w =(int*)&e;  //legal but bad practice

四 类中的const

  类中的const必须在构造函数的初始化列表里面初始化或者将其设置为static

  class A{

           A() { const int size=3;}

          };

      或者:

       class A {

             static const int size=3;

      };

       

C++中,`const`关键字对指针的声明和使用具有重要影响,主要体现在以下几种情况: ### 指向常量的指针(Pointer to Constant) 当声明一个指向常量的指针时,表示不能通过该指针修改其所指向的对象。例如: ```cpp const int AMOUNT = 100; const int *p = &AMOUNT; ``` 在这种情况下,`*p`是只读的,尝试修改`*p`会导致编译错误。需要注意的是,虽然指针本身可以被重新赋值以指向不同的对象,但所指向的对象内容不可更改[^1]。 ### 常量指针Constant Pointer) 常量指针是指指针本身是一个常量,一旦初始化后,就不能再改变其指向的对象。例如: ```cpp int x = 10; int y = 20; int *const p = &x; p = &y; // 不合法,因为指针本身是常量 ``` 上述代码中,`p`是一个常量指针,它只能指向`x`,不能重新指向其他变量[^4]。 ### 指向常量的常量指针Constant Pointer to Constant) 这种情况下,既不能修改指针所指向的对象,也不能修改指针本身的指向。例如: ```cpp const int AMOUNT = 100; const int *const p = &AMOUNT; ``` 此时,`p`是一个指向常量的常量指针,既不能修改`AMOUNT`的值,也不能让`p`指向其他对象[^1]。 ### 常量引用(Constant Reference) 虽然不是直接涉及指针,但`const`相关的引用也值得一提。常量引用允许将一个常量值绑定到一个引用上,从而避免复制操作并确保原始值不被修改。例如: ```cpp void printMessage(const std::string &msg) { // msg cannot be modified inside this function } ``` 这里,`msg`是一个常量引用,函数内部不能修改`msg`的值,同时避免了复制`std::string`对象的开销[^2]。 ### 权限缩小(Access Restriction) `const`还可以用于权限缩小,即通过引用或指针限制对原始变量的访问权限。例如: ```cpp int main() { int c = 20; const int &b = c; // b = 30; // 不合法,因为b是const修饰的引用 return 0; } ``` 在这个例子中,`b`是对`c`的一个常量引用,因此不能通过`b`来修改`c`的值,这是权限的缩小[^5]。 ### 总结 - `const`可以修饰指针所指向的对象,使得该对象不可通过指针修改。 - `const`也可以修饰指针本身,使其成为常量指针,不能重新赋值。 - 组合使用`const`可以创建指向常量的常量指针。 - 常量引用提供了一种避免复制大对象的方法,并确保对象不会被意外修改。 这些特性使得`const`在C++编程中成为一种强大的工具,用于提高代码的安全性和可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值