【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; 
 }

结语

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

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

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

目录
相关文章
|
1月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
32 11
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
2月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
3月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
58 0
|
3月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
42 0
|
10天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
39 4
|
12天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
35 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1