C++中 const 限定符
1. 基本概念
在C++中,const是一个类型限定符,用于指定一个变量是常量,即其值在初始化后不能被修改。这有助于提高程序的可读性、可维护性和安全性,同时也允许编译器进行更多的优化。例如:
const int num = 10; // num = 20; // 这是错误的,因为num是常量,不能被重新赋值
2. 常量的初始化
在定义时初始化:常量必须在定义的时候进行初始化。可以使用常量表达式或者其他已经初始化的变量来初始化常量。例如:
const int num1 = 5; const int num2 = num1 * 2;
对于类的常量成员:如果是类的成员变量为const类型,需要通过初始化列表进行初始化(在构造函数中)。例如:
class MyClass { public: const int myConst; MyClass(int value) : myConst(value) {} };
3. const与指针
指向常量的指针(const修饰所指对象):这种指针指向的对象是常量,不能通过该指针修改所指向的对象的值,但指针本身可以改变指向。例如:
const int num = 10; const int* ptr = # // *ptr = 20; // 错误,不能通过ptr修改num的值 int otherNum = 30; ptr = &otherNum; // 可以改变指针的指向
常量指针(const修饰指针本身):指针本身是常量,不能改变指针的指向,但可以通过指针修改所指向对象的值(前提是所指向的对象不是常量)。例如:
int num = 10; int* const ptr = # *ptr = 20; // 可以修改num的值 // ptr = &otherNum; // 错误,不能改变指针的指向
指向常量的常量指针(const既修饰指针又修饰所指对象):指针本身不能改变指向,并且不能通过该指针修改所指向对象的值。例如:
const int num = 10; const int* const ptr = # // *ptr = 20; // 错误,不能修改num的值 // ptr = &otherNum; // 错误,不能改变指针的指向
4. const与函数
const修饰函数参数:如果函数的某个参数在函数体内不应该被修改,可以将该参数声明为const。这有助于提高程序的可读性,同时也防止函数内部意外修改参数的值。例如:
void printValue(const int num) { // num = 20; // 错误,不能在函数内部修改num的值 std::cout << num << std::endl; }
const修饰函数返回值:当函数返回一个常量时,返回值不能被用作左值(即不能被修改)。例如:
const int getValue() { static int num = 10; return num; } int main() { // getValue() = 20; // 错误,不能对常量返回值进行赋值操作 std::cout << getValue() << std::endl; return 0; }
const成员函数:在类中,成员函数可以被声明为const。const成员函数承诺不会修改类的成员变量(除了mutable成员变量)。例如:
class MyClass { public: int value; MyClass(int num) : value(num) {} int getValue() const { // value = 20; // 错误,在const成员函数中不能修改非mutable成员变量 return value; } };
5. const与类型别名
可以使用typedef或者using来创建const类型的别名。例如:
typedef const int ConstInt; using AnotherConstInt = const int;
这样在定义变量时就可以使用这些别名来表示const类型。例如:
ConstInt num = 10; AnotherConstInt otherNum = 20;
6. const表达式
C++11引入了constexpr关键字,用于表示常量表达式。constexpr函数或者变量的值在编译时就可以确定。const变量不一定是constexpr变量,但constexpr变量一定是const变量。例如:
constexpr int num = 5 + 3; // 这是一个constexpr变量,其值在编译时确定 const int otherNum = getValue(); // 这是一个const变量,但不是constexpr变量,因为getValue()是运行时确定的值
C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线