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

结语

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

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

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

目录
相关文章
|
7月前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
279 2
|
1月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
72 0
|
8月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
170 3
【C++】map、set基本用法
|
7月前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
172 0
|
9月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
102 11
|
10月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
5月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
45 0
|
1月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
115 0
|
3月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
115 12