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

简介: 【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; 
 }

结语

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

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

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

目录
相关文章
|
9天前
|
存储 程序员 C语言
c++primer plus 6 读书笔记 第四章 复合类型
c++primer plus 6 读书笔记 第四章 复合类型
|
14小时前
|
安全 程序员 C++
C++中的类型查询:探索typeid和type_info
C++中的类型查询:探索typeid和type_info
7 1
|
2天前
|
存储 编译器 程序员
C++一分钟之-auto关键字与类型推导
【6月更文挑战第21天】`auto`在C++11中重生,简化了类型声明,尤其在处理复杂类型时。它让编译器根据初始化值推导变量类型,减少了冗余和错误。使用`auto`简化了迭代器声明和函数返回类型推导,但也带来挑战:类型推导可能不直观,未初始化的`auto`是错误的,且过度使用影响可读性。使用`auto&`和`auto*`明确引用和指针,`decltype`辅助复杂类型推导,保持适度使用以维持代码清晰。
14 1
|
3天前
|
C语言 C++
C++对C的改进和拓展\string类型
C++对C的改进和拓展\string类型
5 1
|
3天前
|
C++
C++一分钟之-类与对象初步
【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。
30 2
C++一分钟之-类与对象初步
|
3天前
|
存储 编译器 C++
|
3天前
|
C++
C++类和类模板——入门
C++类和类模板——入门
9 1
|
5天前
|
数据安全/隐私保护 C++
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
|
8天前
|
存储 编译器 C++
【C++初阶】—— 类和对象 (中)
【C++初阶】—— 类和对象 (中)
20 3
|
8天前
|
编译器 C++
【C++初阶】—— 类和对象 (下)
【C++初阶】—— 类和对象 (下)
10 2