【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性


更多精彩内容可阅读: C/C++ 关键字专栏


📌作用:用于定义常量变量,**定义时必须初始化变量,定义后就不可再被修改.


const 关键字的作用

  • 用于修饰函数形参,保护参数使其不被修改。

    1.指针传递,不可改值,可以改指针指向地址

    2.引用传递,不可改值。

  • 节约内存空间

    const定义的变量,系统只为它分配一次内存,相比于宏定义(不会分配内存,但会为多个字符串替换).

  • 用于修饰函数返回值,防止返回值被修改。

    接收返回值的变量也必须加const

  • 在另一连接文件文件中引用常量,extern const int i;


const 关键字的使用场景

const修饰指针

 const int *A;int const *A;  //const修饰指向的对象,A可变,A指向的对象不可变 .
 int *const A;               //const修饰指针A, A不可变,A指向的对象可变 
 const int *const A;           //指针A和A指向的对象都不可变
int * const p=&a;  //const修饰的指针不可改变指向,且必须初始化。

const修饰对象(常对象)

常对象指该对象在其生命周期内,其所有的数据成员的值都不能被改变.

一旦将对象定义为常对象之后,只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)。

const修饰类的成员方法(常成员函数)

const 修饰的成员函数

  • 可以访问所有成员变量但不能修改其值,

  • 只能调用常成员函数不能调用非 const 修饰的函数.

const修饰类的成员变量

  • 初始化const int类型(不包含static类型)

    • 初始化方式一:构造函数初始化列表方式(C++98)

    • 初始化方式二:类内初始化(c++11支持)

  • 初始化const static int类型

    • 初始化方式一:类的构造函数上初始化(c++11支持).

    • 初始化方式二:在类外初始化,类外初始化时不必指明static属性(static原则).


const 关键字的使用事项

  • 指针间传递

    C语言中,const int * 和const int复制给int * 会舍弃const,C++不允许这样的操作(遵守底层const原则)。
    将int * 赋值给const int * 类型则没问题。

  • 通过指针的指向const变量可以间接改变其值.

  • 构造函数不能被声明为const

  • const成员函数若返回对象引用,也必须是const 类型(否则会报错)

    error: binding reference of type 'class' to value of type 'const class' drops 'const' qualifier
    
  • 将数据声明为可变数据成员

    在C++语言中,mutable是使用较少的关键字,

    它的作用是:如果一个函数被const 修饰,那么它将无法修改其成员变量的,但是如果一个成员变量是被mutable修饰的话,则可以修改。

    mutable 可以用来指出,即使成员函数或者类变量为const,其某个成员也可以被修改。反过来说,可变数据成员永远不能成为const,即使它是const对象的成员。


const 关键字的使用示例

class A { 
public:
    const int a;
    A(int x):a(x)//正确
    {
        a = x;//错误
    } 
};

    int x;
    mutable int y;
    A(int a, int b):x(a),y(b){} };

 int main()
 {
    const A a(0, 0); // const对象必须初始化
    a.x = 1;         // 错误
    a.y = 2;         // 正确,mutable修饰使得成员可被修改,即使对象a为const
    return 0; 
 }

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡沫o0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值